其他一些答案已经指出了回溯模块。
请注意,在某些极端情况下,您将无法获得预期的效果。在 Python 2.x 中:print_exc
import traceback
try:
raise TypeError("Oups!")
except Exception, err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_exc()
...将显示上一个异常的回溯:
Traceback (most recent call last):
File "e.py", line 7, in <module>
raise TypeError("Again !?!")
TypeError: Again !?!
如果您确实需要访问原始回溯,一个解决方案是将从exc_info
返回的异常信息缓存在局部变量中,并使用print_exception
显示它:
import traceback
import sys
try:
raise TypeError("Oups!")
except Exception, err:
try:
exc_info = sys.exc_info()
# do you usefull stuff here
# (potentially raising an exception)
try:
raise TypeError("Again !?!")
except:
pass
# end of useful stuff
finally:
# Display the *original* exception
traceback.print_exception(*exc_info)
del exc_info
生产:
Traceback (most recent call last):
File "t.py", line 6, in <module>
raise TypeError("Oups!")
TypeError: Oups!
不过,这有几个陷阱:
-
来自sys_info
的文档:
将回溯返回值分配给正在处理异常的函数中的局部变量将导致循环引用。这将防止同一函数中的局部变量或回溯引用的任何内容被垃圾回收。[...]如果您确实需要回溯,请确保在使用后将其删除(最好尝试一下...最后声明)
-
但是,来自同一文档:
从Python 2.2开始,当启用垃圾回收并且它们变得无法访问时,这些循环会自动回收,但是避免创建循环仍然更有效。
另一方面,通过允许您访问与异常关联的回溯,Python 3产生了一个不那么令人惊讶的结果:
import traceback
try:
raise TypeError("Oups!")
except Exception as err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_tb(err.__traceback__)
...将显示:
File "e3.py", line 4, in <module>
raise TypeError("Oups!")