关于回溯:有没有办法在python中访问嵌套或重新引发的异常?

Is there any way to access nested or re-raised exceptions in python?

python中的一个常见模式是捕获上游模块中的错误并将该错误重新引发为更有用的错误。

1
2
3
4
try:
    config_file = open('config.ini', 'r')
except IOError:
    raise ConfigError('Give me my config, user!')

这将生成表单的堆栈跟踪

1
2
3
Traceback (most recent call last):
  File"<stdin>", line 4, in <module>
__main__.ConfigError: Give me my config, user!

有没有办法访问包装的异常,以生成更像这样的堆栈跟踪?

1
2
3
4
5
6
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!

编辑:

我试图打败的问题是,一些第三方代码可以包装异常最多3次,我希望能够确定根本原因,即检查异常堆栈并确定异常的根本原因的通用方法 无需向第三方模块添加任何额外代码。


这被称为异常链接,并在Python 3中被支持。

PEP 3134:http://www.python.org/dev/peps/pep-3134/

在Python 2中,除非将其保存在except块中,否则在引发新异常时会丢失旧异常。


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

1
2
3
4
5
6
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,您可以根据需要使用它。