在 Python 提示符处引发错误后如何获取最后一个异常对象?

Posted

技术标签:

【中文标题】在 Python 提示符处引发错误后如何获取最后一个异常对象?【英文标题】:How to get the last exception object after an error is raised at a Python prompt? 【发布时间】:2013-03-14 09:50:25 【问题描述】:

在交互式提示符 (REPL) 调试 Python 代码时,我通常会编写一些引发异常的代码,但我没有将其包装在 try/except 中,因此一旦引发错误,我永远失去了异常对象。

Python 打印出来的回溯和错误消息通常是不够的。例如,在获取 URL 时,服务器可能会返回 40x 错误,而您需要通过 error.read() 获得响应的内容……但您不再获得错误对象。例如:

>>> import urllib2
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  ...
urllib2.HTTPError: HTTP Error 400: Bad Request

Drat,回复的正文说了什么?它可能包含有价值的错误信息...

我意识到重新运行包含在 try/except 中的代码通常很容易,但这并不理想。我也意识到,在这种特定情况下,如果我使用 requests 库(不会引发 HTTP 错误),我就不会遇到这个问题......但我真的想知道是否有更通用的方法在这些情况下,在 Python 提示符处获取最后一个异常对象。

【问题讨论】:

【参考方案1】:

sys 模块提供了一些用于事后检查异常的函数:sys.last_typesys.last_valuesys.last_traceback

sys.last_value 就是您要找的那个。

【讨论】:

@BenHoyt 仅供参考,根据sys 的文档,“这三个仅在打印回溯后的交互式会话中可用。”。 @satoru 好吧,很明显。在正常程序中,未处理的异常将终止程序。 我不得不搜索一下以找到正确的代码,以便使用回溯模块正确打印所有这些。如果有人需要,这里是:traceback.print_exception(etype=sys.last_type,value=sys.last_value,tb=sys.last_traceback)【参考方案2】:

正如@Cairnarvon 提到的,我没有发现任何last_valuemember 是sys 模块。

sys.exc_info() 帮了我大忙。 sys.exc_info() 返回一个包含三个值 (type, value, traceback) 的元组。

所以sys.exc_info()[1] 将给出可读错误。这是一个例子,

import sys
list = [1,2,3,4]
try:
    del list[8]
except Exception:
    print(sys.exc_info()[1])

将输出list assignment index out of range

另外,traceback 模块中的traceback.format_exc() 也可用于打印出类似的信息。

下面是使用format_exec()时的输出,

Traceback (most recent call last):
  File "python", line 6, in <module>
IndexError: list assignment index out of range

【讨论】:

这是另一个问题的答案。 sys.exc_info 仅在您在 except 子句中时返回有用的信息;问题是关于在 它已经被触发之后获取有关最后一个异常的信息。

以上是关于在 Python 提示符处引发错误后如何获取最后一个异常对象?的主要内容,如果未能解决你的问题,请参考以下文章

带有Kerberos的PyHive在几次调用后引发身份验证错误

遍历 hastable 键的枚举会引发 NoSuchElementException 错误

类型初始值设定项引发异常

vs提示缺少引用 定位到报错处后错误又自动消失

Antd Table 删除最后一页数据引发的序号问题

必须重置适配器后,蓝牙的 Python 代码会引发错误