我正在一个大型的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...
如何打印其余的回溯,以便可以看到看起来像普通回溯的东西,告诉我包装代码中实际出了什么问题?
答案 0 :(得分:2)
您应该raise
不传递任何异常,以使该异常通过而不重新引发。
更改:
raise what
收件人:
raise