如何仅修改geometry.py自定义Python异常的traceback输出(保留指定调用信息)
如何仅修改geometry.py自定义Python异常的traceback输出(保留指定调用信息)
我完全懂你的需求——只想让错误提示里保留主程序main.py的调用行和最终的错误描述,把geometry.py里的那层调用栈给藏起来,而且全程只改geometry.py就行,不用碰主程序对吧?
这里有个直接可行的方案,只需要在geometry.py里修改抛出异常的逻辑,手动裁剪traceback栈:
首先在geometry.py顶部导入sys模块,然后在Pyramid类的构造方法里,抛出异常前先调整traceback:
import sys class Pyramid(): def __init__(self, sign, name): if len(sign.split(".")) != 2: # 创建自定义错误对象 error_msg = "pyramid must have 1 apex and 1 base" err = ValueError(error_msg) # 获取当前的traceback栈,跳过当前geometry.py的帧 current_tb = sys.exc_info()[2] if current_tb is not None: # tb_next指向调用栈的上一层(也就是main.py里的调用代码) err.__traceback__ = current_tb.tb_next # 抛出处理后的异常 raise err # 你的其他初始化代码...
原理说明
Python的traceback是链式结构,每个traceback对象的tb_next属性指向调用栈的上一层。我们这里把异常的__traceback__直接设置为当前栈的上一层,就相当于跳过了geometry.py里raise语句所在的那一层调用栈,最终输出的traceback就只会保留main.py的调用行和错误描述,完全符合你的预期。
测试一下,当你在main.py里传入错误的参数时,输出的traceback就会变成:
Traceback (most recent call last): File "d:\Main\WORK STATION\PYTHON\GEOMETRY\main.py", line 13, in <module> S = geometry.Pyramid("S.A.BCD", "S") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ValueError: pyramid must have 1 apex and 1 base
这种方法完全不需要修改main.py,所有逻辑都封装在geometry.py里,完美满足你的要求。
备注:内容来源于stack exchange,提问作者JACOBnotpro
相关产品推荐
相关产品推荐

