如何从Python Traceback输出中移除raise ValueError()行?
实现无raise行的异常Traceback输出
首先明确:math.factorial这类标准库函数是用C语言实现的,Python解释器处理C扩展抛出的异常时,不会生成对应Python代码的栈帧,所以traceback里只会显示调用它的那一行,不会出现Python代码里的raise语句行。
如果要在纯Python代码里实现同样效果,不需要try-except,只需手动修改异常的traceback栈帧,跳过raise语句所在的那一层:
import sys def f(x): if x == 0: exc = ValueError("Input is zero") # 移除当前函数中raise语句对应的栈帧 exc.__traceback__ = exc.__traceback__.tb_next raise exc return print(f(0))
运行这段代码后,输出的traceback如下:
Traceback (most recent call last): File "your_file.py", line 10, in <module> print(f(0)) ValueError: Input is zero
原理说明
每个异常对象都有__traceback__属性,指向生成该异常的栈帧链。通过将__traceback__设置为它的tb_next(即下一层栈帧),就能跳过当前函数中raise语句所在的帧,traceback自然就不会显示那一行了。
内容的提问来源于stack exchange,提问作者Raymond
相关产品推荐
相关产品推荐

