手动创建Python追踪信息

6 投票
1 回答
911 浏览
提问于 2025-04-18 09:02

在Python中,可以创建自定义的错误追踪信息吗?我想写一个函数 raise_from(),它模仿Python 3中的 raise ... from ...

def raise_from(exc, cause):
    """ Raises the Exception *exc* from the calling stack-frame,
    settings its ``__cause__`` to *cause*. """

    exc.__cause__ = cause

    try: raise Exception
    except Exception:
        tb = sys.exc_info()[2]

    # Remove the last traceback entry.
    prelast_tb = tb
    while prelast_tb.tb_next:
        prelast_tb = prelast_tb.tb_next
    prelast_tb.tb_next = None

    raise type(exc), exc, tb

不过,traceback 实例的属性是只读的,也就是说你不能直接修改它们。

1 个回答

0

与其直接修改异常的原始对象实例,不如使用格式化函数将追踪对象转换成更简单的格式,比如列表。然后在自定义这个追踪列表后,再把它转换回像原来那样可以打印的字符串。
所以,你只需要把自定义的追踪信息打印到你想要的文件里(包括标准输出等)。

tb_list = traceback.extract_tb(tb)
tb_list = tb_list[:-1] #omitting the last trace-back entry
tb_str = tb.format_list(tb_list)
# print whatever

但是如果你想要覆盖追踪对象的原始属性,就需要通过自定义槽或者重写类的@property字段来修改TraceBack对象。

撰写回答