我想在不退出的情况下捕获并记录异常,例如,
try: do_stuff() except Exception as err: print(Exception, err) # I want to print the entire traceback here, # not just the exception name and details
我想打印在没有 try..except 拦截异常的情况下引发异常时打印的完全相同的输出,并且我 不 希望它退出我的程序。我该怎么做呢?
其他一些答案已经指出了回溯模块。
请注意print_exc,在某些极端情况下,您将无法获得预期的结果。在 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_infoprint_exception
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
将回溯返回值分配给处理异常的函数中的局部变量将导致 循环引用 。这将防止同一函数中的局部变量或回溯引用的任何内容被垃圾收集。[…] 如果您确实需要回溯,请确保在使用后将其删除 (最好使用 try … finally 语句完成)
从 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!")