我正在构建一个工具,当异常向上传播时,有关异常上下文的新数据将添加到异常中。问题是,当异常到达顶层时,所有额外的上下文数据都在那里,但只显示最新的堆栈跟踪。有没有一种简单的方法可以让异常显示抛出异常的原始堆栈跟踪而不是最后一个堆栈跟踪,或者我应该做一些事情,例如在异常第一次传播时获取原始堆栈跟踪?
例如,以下代码:
def a():
return UNBOUND
def b():
try:
a()
except Exception as e:
raise e
b()
产生以下异常:
Traceback (most recent call last):
File "test.py", line 8, in <module>
b()
File "test.py", line 7, in b
raise e
NameError: global name 'UNBOUND' is not defined
理想情况下,我想以某种方式向用户展示:
Traceback (most recent call last):
File "test.py", line 8, in <module>
File "test.py", line 2, in a
return UNBOUND
NameError: global name 'UNBOUND' is not defined
因为这会将用户指向最初发生错误的行。
Python异常有点像java,有一种方法可以在不截断堆栈的情况下重新抛出异常。
只需使用raise
没有争论。结果是:
Traceback (most recent call last):
File "./exc.py", line 11, in <module>
b()
File "./exc.py", line 7, in b
a()
File "./exc.py", line 4, in a
return UNBOUND
NameError: global name 'UNBOUND' is not defined
您可以修改一些关于e
对象,即使你只是raise
没有这个论点 - 例如:
e.args = ("hi!",)
raise
实际上会改变异常消息。您也可以通过这种方式更改其他选项 - 而不破坏堆栈。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)