如何建立一个指向已保存的python追溯的异常?

问题描述

我正在尝试做一些奇怪的事情。我想在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