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

新手上路,请多包涵

在交互式提示符 (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 提示符下获取最后一个异常对象。

原文由 Ben Hoyt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 544
2 个回答

正如@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

原文由 Kumar Sambhav Pandey 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题