如何在不停止/退出程序的情况下捕获并打印完整的异常回溯?

新手上路,请多包涵

我想在不退出的情况下捕获并记录异常,例如,

 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 拦截异常的情况下引发异常时打印的完全相同的输出,并且我 希望它退出我的程序。

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

阅读 520
2 个回答

其他一些答案已经指出了 回溯 模块。

请注意 print_exc ,在某些极端情况下,您将无法获得预期的结果。在 Python 2.x 中:

 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!

虽然这有一些陷阱:

将回溯返回值分配给正在处理异常的函数中的局部变量将导致 循环引用。这将防止由同一函数中的局部变量或回溯引用的任何内容被垃圾收集。 […] 如果您确实需要追溯,请确保在使用后将其删除(最好使用 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!")

原文由 Sylvain Leroux 发布,翻译遵循 CC BY-SA 3.0 许可协议

traceback.format_exc()sys.exc_info() 将产生更多信息,如果这是你想要的。

 import traceback
import sys

try:
    do_stuff()
except Exception:
    print(traceback.format_exc())
    # or
    print(sys.exc_info()[2])

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

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