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

How to get the last exception object after an error is raised at a Python prompt?

在交互式提示符(REPL)上调试Python代码时,我经常会编写一些引发异常的代码,但是我没有把它包装在try / except中,所以一旦出现错误,我就是' 我永远失去了异常对象。

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

1
2
3
4
5
6
>>> 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提示符下获取最后一个异常对象。


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

sys.last_value是您正在寻找的那个。


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

sys.exc_info()为我做了诀窍。 sys.exc_info()返回具有三个值(type, value, traceback)的元组。

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

1
2
3
4
5
6
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(),则输出如下,

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