我正在开发一个大型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...
如何将其余的回溯打印出来,这样我就可以看到看起来像普通回溯的东西,告诉我在包装代码中究竟出了什么问题?
你应该在没有传递异常的情况下使用raise
,以便在不重新引发的情况下传递异常。
更改:
raise what
至:
raise