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

问题描述 投票:1回答:1

我正在开发一个大型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)中导入它并导入它时,我得到了一个堆栈跟踪,直到失败的地步。但是,现在(或者无论如何),我的堆栈跟踪在包装器处停止,而没有告诉我在包装器调用中失败了什么,如下所示:

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...

如何将其余的回溯打印出来,这样我就可以看到看起来像普通回溯的东西,告诉我在包装代码中究竟出了什么问题?

python-3.x python-decorators traceback
1个回答
2
投票

你应该在没有传递异常的情况下使用raise,以便在不重新引发的情况下传递异常。

更改:

raise what

至:

raise
© www.soinside.com 2019 - 2024. All rights reserved.