【发布时间】:2012-04-23 14:26:57
【问题描述】:
我正在编写一些可以在堆栈深处生成异常的代码,并且我有一个更靠近顶部的层来捕获这些异常并将它们发送给错误处理模块进行处理。我希望错误处理模块能够将堆栈跟踪打印到其错误日志中,但我发现很难弄清楚这样做的方法是什么。
关于背景的一些注释:
代码是多线程的,所以我不确定 sys.last_traceback 的行为
-
我尝试在异常本身的构造函数中捕获堆栈。 sys.last_traceback 在这种情况下有时是 None (因为它只存在于未处理的异常的情况下),并不总是正确的。我目前正在玩弄使用
self.stack = traceback.format_stack()[:-2]
在异常的构造函数中,虽然这在信息方面看起来很有希望,但感觉不是“正确”的方法
我能够找到的所有如何执行此操作的示例都显示了如何在 except 块中打印堆栈跟踪,而不是在稍后的错误处理模块中,这似乎与我想要的是。 (例如,参见Print current call stack from a method in Python code)
我在 python 文档 (http://docs.python.org/library/traceback.html) 中挖掘了回溯模块,但无法弄清楚这是否符合我的要求。它似乎主要关注格式化回溯,因为您可能从 sys.last_traceback 检索。它有一些使用示例,但没有一个与我想要做的一致。
我不相信我是第一个想要这样做的人,所以我一定是错过了什么。任何指向正确方向的指针都非常感谢。
【问题讨论】:
-
"我能够找到的所有如何执行此操作的示例都显示了如何在 except 块中打印堆栈跟踪,而不是在以后的一些错误处理模块中,这似乎有所不同在我想要的行为中。”我不明白怎么做。展示一个示例,以及预期和实际的输出。
-
嗨@KarlKnechtel - 我发现的另一个例子是doughellmann.com/PyMOTW/traceback 在except 块中使用print_exc() 报告了错误,但是当我在except 块之外使用这个函数时,我什么也得不到(无)
-
所以...它只能在 except 块内工作。但重点是抛出异常,然后,“靠近顶部的一层会捕获这些异常”。那么在 that 除了块之外这样做有什么问题呢?
标签: python exception error-handling stack-trace printstacktrace