检索Python异常对象



我有一段我无法控制的代码,在运行时引发了一个错误。我想在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__显式地链接异常。

<<blockquote>

内置异常/h1>[…
当在except或finally子句中引发(或重新引发)异常时,__context__被自动设置为捕获的最后一个异常;如果新的异常没有被处理,最终显示的回溯将包括原始异常和最终异常。

raise语句

[…
from子句用于异常链接:如果给定,第二个表达式必须是另一个异常类或实例,然后作为__cause__属性(可写)附加到引发的异常上。[…[br/>如果在异常处理程序或finally子句中引发异常,则类似的机制隐式地起作用:然后将先前的异常附加为新异常的__context__属性:

最新更新