Есть ли способ получить доступ к вложенным или повторно поднятым исключениям в python?

Общий шаблон в 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 Solutions collect form web for “Есть ли способ получить доступ к вложенным или повторно поднятым исключениям в python?”

Это известно как цепочка исключений и поддерживается в Python 3.

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

В Python 2 старое исключение теряется при создании нового, если вы не сохраните его в блоке except .

Используйте модуль traceback . Это позволит вам получить доступ к самой последней трассировке и сохранить ее в строке. Например,

 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
  • Как изменить объект трассировки Python при создании исключения?
  • Python: как отформатировать объекты трассировки
  • Импорт трассировки Python
  • Python - лучший язык программирования в мире.