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

问题描述 投票:0回答:3

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

python exception try-catch read-eval-print-loop
3个回答
90
投票

sys
模块提供了一些用于事后检查异常的功能:
sys.last_type
sys.last_value
sys.last_traceback

sys.last_value
就是您要找的人。


34
投票

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

1
投票

sys.last_type
sys.last_value
sys.last_traceback
变量并不总是定义的。实际上,它们旨在用于交互式会话。我能够使用
sys.exc_info()
获得最后引发的异常。用途:

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

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

ex_value

© www.soinside.com 2019 - 2024. All rights reserved.