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

时间:2012-01-25 03:18:05

标签: 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>
__main__.ConfigError: Give me my config, user!

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

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次,我希望能够确定根本原因,即检查异常堆栈并确定根本原因的通用方法无需向第三方模块添加任何额外代码即可获得异常。

2 个答案:

答案 0 :(得分:10)

这称为 Exception Chaining ,并在Python 3中被支持。

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

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

答案 1 :(得分:4)

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

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,您可以根据需要使用它。