问题描述
我正在尝试做一些奇怪的事情。我想在Python中保存堆栈跟踪,然后在以后的行中引发异常时,希望该异常具有我之前保存的堆栈跟踪,而不是默认的回溯。我想给人一种错觉,那就是错误发生在与实际发生错误不同的行上。
为了更具体一点,我希望能够做类似的事情
class Pipeline:
def __init__(self):
saved_traceback = None
def m1(self):
# ... Do some work ....
saved_traceback = save_traceback()
def execute(self):
try:
# .... Do Some work
except Exception as e:
raise SpecialError(saved_traceback)
然后我将运行一个脚本,如:
foo = Pipeline()
foo.m1()
foo.execute()
我想以这样的方式实现execute
:如果在执行过程中出现错误,则回溯指向对m1
的调用。这是一种惰性管道构建领域特定语言的一部分,在调用execute
之前,任何工作都不会发生,因此所有错误消息都将来自execute
。相反,我希望用户看到一个错误,该错误指向添加了错误管道步骤的方法。
解决方法
您可以使用traceback.format_exc()
将追溯保存为字符串。
import traceback
try:
print(a)
except:
traceback_str = traceback.format_exc()
print(a)
将以NameError
失败,因为从未定义a
。在except
块中,最新的回溯将作为字符串保存到traceback_str
。