在回溯中如何抛出异常而不使用'reraise'?

8 投票
1 回答
1838 浏览
提问于 2025-04-16 19:54

可能重复的问题:
不要在异常堆栈中显示Python的raise行

NameError 这样的内置异常会给我提供一个追踪信息,告诉我代码中发生异常的具体位置。我正在开发一个工具模块,但让我感到烦恼的是,如果使用我的模块的代码抛出异常,追踪信息中最后一行总是我的 raise WhateverError

有没有办法在Python中抛出异常,并让追踪信息停在比我抛出异常的地方高一层,就像内置异常那样(而不需要写C代码)?

1 个回答

3

纯Python并没有提供一种方法来修改已经存在的错误追踪对象,或者创建任意的错误追踪对象。

>>> exc_info[2].tb_next = None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: readonly attribute

>>> types.TracebackType()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot create 'traceback' instances

要注意的是,如果可以这样做,不仅会影响错误追踪的默认格式,还会干扰别人使用pdb工具来分析你这个工具模块中的错误。

如果你的工具模块正在记录错误追踪信息或者以其他方式格式化这些信息,你可以选择不在输出中包含那些你认为不重要的部分。例如,标准库中的unittest模块在报告测试运行时发生的错误时就是这样做的。

撰写回答