6

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

关于背景的一些说明:

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

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

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

在异常的构造函数中,虽然这在信息方面看起来很有希望,但感觉不是“正确”的方法

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

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

我不相信我是第一个想要这样做的人,所以我一定错过了一些东西。任何指向正确方向的指针都非常感谢。

4

3 回答 3

2

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

exc_type, exc_value, exc_traceback = sys.exc_info()

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

于 2012-04-11T11:46:11.930 回答
0

如果我理解正确,您想在保留堆栈跟踪的同时重新引发异常吗?所以你有一个这样的调用层次结构:

error_handling_module # you want to print the stacktrace here
|
something_else
|
module_excepting_and_rethrowing
|
something_else
|
module_raising_an_error

在你 module_excepting_and_rethrowing 你可以这样做:

except Exception:
   exc_type, exc_value, exc_traceback = sys.exc_info()
   raise NewException, exc_value, exc_traceback

在 Python3 中,您还可以执行以下操作:

 except Exception as e:
     raise NewException from e
于 2012-04-11T13:38:06.147 回答
0

在要保护的函数中添加一些装饰器怎么样?例如:

@onerrorignore
def foo(a, b, c):
    ...

装饰器看起来像:

def onerrorignore(f):
    def _f(*args, **kwargs):
        try:
            ret = f()
        except:
            error_handler.handle(sys.exc_info())
        else:
            return ret
    return _f
于 2012-04-11T13:23:59.963 回答