在交互式提示符(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
天啊,回复正文说了什么?它可能包含有价值的错误信息......
我意识到重新运行包含在 try/ except 中的代码通常很容易,但这并不理想。我还意识到,在这种特定情况下,如果我使用
requests
库(不会引发 HTTP 错误),我就不会遇到这个问题......但我真的想知道是否有更通用的方法在这些情况下,在 Python 提示符处获取最后一个异常对象。
正如@Cairnarvon提到的,我没有找到任何
last_value
成员是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.format_exc()
模块中的traceback
可用于打印类似信息。
下面是使用
format_exec()
时的输出,
Traceback (most recent call last):
File "python", line 6, in <module>
IndexError: list assignment index out of range
sys.last_type
、sys.last_value
和sys.last_traceback
变量并不总是定义的。实际上,它们旨在用于交互式会话。我能够使用 sys.exc_info()
获得最后引发的异常。用途:
import sys
ex_type, ex_value, traceback = sys.exc_info()
最后引发的异常对象将存储在
ex_value