有没有办法访问python中嵌套的或重新引发的异常?

有没有办法访问python中嵌套的或重新引发的异常?,python,traceback,Python,Traceback,python中的一种常见模式是捕获上游模块中的错误,并将该错误作为更有用的东西重新引发 try: config_file = open('config.ini', 'r') except IOError: raise ConfigError('Give me my config, user!') 这将生成表单的堆栈跟踪 Traceback (most recent call last): File "<stdin>", line 4, in <module

python中的一种常见模式是捕获上游模块中的错误,并将该错误作为更有用的东西重新引发

try:
    config_file = open('config.ini', 'r')
except IOError:
    raise ConfigError('Give me my config, user!')
这将生成表单的堆栈跟踪

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
__main__.ConfigError: Give me my config, user!
回溯(最近一次呼叫最后一次):
文件“”,第4行,在
__配置错误:给我配置,用户!
有没有办法访问包装的异常以生成更像这样的堆栈跟踪

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
__builtin__.IOError: File Does not exist.
Exception wrapped by:
  File "<stdin>", line 4, in <module>
__main__.ConfigError: Give me my config, user!
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
__内置\uuu0.IOError:文件不存在。
异常包装人:
文件“”,第4行,在
__配置错误:给我配置,用户!
编辑:
我试图解决的问题是,一些第三方代码最多可以包装3次异常,我希望能够确定根本原因,即检查异常堆栈并确定异常根本原因的通用方法,而无需向第三方模块添加任何额外代码。

使用
回溯
。它将允许您访问最新的回溯并将其存储在字符串中。比如说,

import traceback
try:
    config_file = open('config.ini', 'r')
except OSError:
    tb = traceback.format_exc()
    raise ConfigError('Give me my config, user!',tb)
“嵌套”回溯将存储在tb中,并传递给ConfigError,在那里您可以根据需要使用它。

这称为异常链接,在Python 3中得到支持

政治公众人物3134:


在Python 2中,当您提出新异常时,旧异常将丢失,除非您将其保存在
except
块中。

sys.last\u traceback是否有帮助?也可以查看抱歉,这是一个恼人的问题,但是。。。为什么?我想知道是否有一种方法可以做到这一点而不显式地转到异常块?我可以一次打印一条异常消息。。。但是有更好的方法吗?@senderle“一些第三方代码最多可以包装3次异常,我希望能够确定根本原因”此外,format_exc()(存储在tb中)的结果只是一个字符串,它包含与不在try/except块中时打印的文本完全相同的文本。要回答您的编辑,据我所知,format_exc函数将在回溯中输出所有可用信息。如果第三方模块“抑制”了try/except循环中的某些信息,您将无法在不修改特定try/except循环的情况下检索这些信息。您所说的“将其保存在except块”是什么意思?有没有一个标准的方法可以做到这一点?