我有一段我无法控制的代码,在运行时引发了一个错误。我想在exc_func
方法中捕获exc
对象的值。
可以看到,exc_func
引发两个异常,其中一个被处理。我关心的是exc
对象的值,但到目前为止还没有找到它。该值在exc_traceback
对象中不存在,异常消息没有多大帮助。
import traceback
import sys
def exc_func():
try:
a = 1
a.length()
except Exception as exc:
exc.with_not_existing()
def main():
try:
exc_func()
except Exception as exc:
exc_type, exc_value, exc_traceback = sys.exc_info()
tb_walk = traceback.walk_tb(exc_traceback)
# Need this in order to pickle traceback
tb_summary = traceback.StackSummary.extract(tb_walk, capture_locals=True)
if __name__ == '__main__':
main()
编辑:例如,main中的exc
对象是AttributeError("'AttributeError' object has no attribute 'with_not_existing'")
。我真正想看到的是exc_func
中的exc
对象。只是为了清楚,我需要exc
对象本身,像traceback.format_exc()
这样的东西在我的情况下没有帮助,由于异常的性质(它是引发此异常的C库)
当处理另一个异常期间引发异常时,初始异常被存储为__context__
。它可以在处理新的异常时提取。
try:
exc_func()
except Exception as exc:
parent = exc.__context__ # the previously handled exception
print(type(parent), parent)
请注意,异常处理程序也可以通过__cause__
显式地链接异常。
内置异常/h1>[…
当在except或finally子句中引发(或重新引发)异常时,__context__
被自动设置为捕获的最后一个异常;如果新的异常没有被处理,最终显示的回溯将包括原始异常和最终异常。
raise语句
[…
from子句用于异常链接:如果给定,第二个表达式必须是另一个异常类或实例,然后作为__cause__
属性(可写)附加到引发的异常上。[…[br/>如果在异常处理程序或finally子句中引发异常,则类似的机制隐式地起作用:然后将先前的异常附加为新异常的__context__
属性: