通过捕获错误在Python中获取堆栈跟踪

时间:2018-09-01 05:53:56

标签: python-3.x python-decorators traceback

我正在一个大型的Web项目(服务器端)上工作,该项目具有一些我要研究的复杂数字算法。整个服务器端代码具有广泛而详尽的错误处理,以使UI具有“良好”的感觉。

但是,尽管我正在开发环境中进行调试,但是如果在计算肠管中出现了一些问题,以便将堆栈跟踪信息发送到终端,这很有用。我这样写了一个小的装饰器/包装器:

import traceback

def dbg(fn):
    def wrapper(*args, **kwargs):
        try:
            res = fn(*args, **kwargs)
            return res

        except Exception as what:
            print("caught trapped debug exception...")
            print(what)
            traceback.print_stack()
            print("re-raising...\n")
            raise what

    return wrapper

然后,在调用数字例程之前,我喜欢这样做:

@dbg
call_complex_numerical_routines(arg1, arg2, ...)

目标是在我的终端上进行追溯,但将错误传递回去,以便复杂的错误处理仍然有效。

我可能会失去理智,但是当我将其保存在单独的文件(dbg.py)中并导入该文件时,我得到了一个堆栈跟踪,该跟踪一直到失败的地步。但是,现在(或无论如何),我的堆栈跟踪都在 wrapper 处停止,而没有告诉我包装器调用中发生了什么失败,例如:

File "/home/utils.py", line 17, in wrapper
    result = func(*args, **kwargs)
File "/home/run.py", line 74, in wrapper
traceback.print_stack()

re-raising...

如何打印其余的回溯,以便可以看到看起来像普通回溯的东西,告诉我包装代码中实际出了什么问题?

1 个答案:

答案 0 :(得分:2)

您应该raise不传递任何异常,以使该异常通过而不重新引发。

更改:

raise what

收件人:

raise