首页 > 解决方案 > 如何构建指向已保存的 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。相反,我希望用户看到指向添加错误管道步骤的方法的错误。

标签: pythonexceptionstack-tracetraceback

解决方案


您可以使用traceback.format_exc()将回溯保存为字符串。

import traceback

try:
    print(a)
except:
    traceback_str = traceback.format_exc()

print(a)将失败,NameError因为a从未定义。在except块中,最近的回溯将保存traceback_str为字符串。


推荐阅读