繁体   English   中英

在 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()获得响应的内容……但您已经没有错误对象了。 例如:

>>> 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 提示符处的最后一个异常对象。

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]会给出可读错误。 这是示例,

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.last_typesys.last_valuesys.last_traceback变量并不总是被定义。 实际上,它们旨在用于交互式会话。 我能够使用sys.exc_info()获得最后一个引发的异常。 用法:

import sys
ex_type, ex_value, traceback = sys.exc_info()

最后引发的异常对象将存储在ex_value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM