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