在Python中处理异常堆栈跟踪的正确方法

Ric*_*d J 6 python error-handling exception stack-trace printstacktrace

我正在编写一些可以在堆栈中生成Exceptions的代码,并且我有一个靠近顶层的层,它捕获这些异常并将它们发送出去以供错误处理模块处理.我想要的是错误处理模块能够将堆栈跟踪打印到其错误日志中,但我发现很难弄清楚这样做的方法是什么.

关于背景的一些注意事项:

  • 代码是多线程的,所以我不确定sys.last_traceback的行为

  • 我已经尝试在异常本身的构造函数中捕获堆栈.在这种情况下,sys.last_traceback有时是None(因为它只存在于未处理的异常情况下),并且并不总是正确的.我目前正在玩弄使用

    self.stack = traceback.format_stack()[: - 2]

在异常的构造函数中,虽然这在信息方面看起来很有前景,但它并不像是"正确"的方式来做到这一点

  • 我能够找到的所有如何执行此操作的示例都显示了如何在except块中打印堆栈跟踪,而不是在以后的错误处理模块中打印,这似乎与我想要的行为不同.(例如,参见Python代码中的方法打印当前调用堆栈)

  • 我已经在python docs(http://docs.python.org/library/traceback.html)中挖掘了traceback模块,并且无法弄清楚这是否符合我的要求.它似乎主要关注格式化回溯,因为您可能从sys.last_traceback检索.它有一些使用示例,但没有一个与我正在尝试做的事情相符.

我不相信我是第一个想要这样做的人,所以我必须遗漏一些东西.任何正确方向的指针都非常赞赏.

Ali*_*har 2

处理异常的第一行可能是:

exc_type, exc_value, exc_traceback = sys.exc_info()
Run Code Online (Sandbox Code Playgroud)

您可以存储这些变量或以任何您喜欢的方式传递它们,然后使用回溯模块来显示它们。