Подтвердить что ты не робот

Исключение исключений в Python

Я работаю над почтовой библиотекой, и я хочу, чтобы улавливать исключения, создаваемые отправителями (SMTP, Google AppEngine и т.д.), и обертывать их легко доступными исключениями для моей библиотеки (ConnectionError, MessageSendError и т.д.), Причем исходная трассировка не повреждена, поэтому ее можно отлаживать. Каков наилучший способ сделать это в Python 2?

4b9b3361

Ответ 1

Самый простой способ - сделать ререйз со старым объектом трассировки. Следующий пример показывает это:

import sys

def a():
    def b():
        raise AssertionError("1")
    b()

try:
    a()
except AssertionError: # some specific exception you want to wrap
    trace = sys.exc_info()[2]
    raise Exception("error description"), None, trace

Подробнее о трех параметрах проверьте документацию инструкцию raise. Мой пример будет печатать:

Traceback (most recent call last):
  File "C:\...\test.py", line 9, in <module>
    a()
  File "C:\...\test.py", line 6, in a
    b()
  File "C:\...\test.py", line 5, in b
    raise AssertionError("1")
Exception: error description

Для полноты в Python 3 вы используете синтаксис raise MyException(...) from e .

Ответ 2

Этот ответ, вероятно, немного запоздал, но вы можете обернуть функцию в python decorator.

Вот простой cheatsheet о том, как разные декораторы.

Вот пример кода, как это сделать. Просто измените decorator, чтобы поймать различные ошибки различными способами, которые вам нужны.

def decorator(wrapped_function):
    def _wrapper(*args, **kwargs):
        try:
            # do something before the function call
            result = wrapped_function(*args, **kwargs)
            # do something after the function call
        except TypeError:
            print("TypeError")
        except IndexError:
            print("IndexError")
        # return result
    return _wrapper


@decorator
def type_error():
    return 1 / 'a'

@decorator
def index_error():
    return ['foo', 'bar'][5]


type_error()
index_error()