Python: восстановить исключение из блока try, если в итоге блок вызывает исключение
Скажем, у меня есть такой код:
try:
try:
raise Exception("in the try")
finally:
raise Exception("in the finally")
except Exception, e:
print "try block failed: %s" % (e,)
Вывод:
try block failed: in the finally
С точки зрения этого оператора печати есть ли способ доступа к исключению, поднятому в try, или он исчез навсегда?
ПРИМЕЧАНИЕ. У меня нет случая использования; это просто любопытство.
Ответы
Ответ 1
Я не могу найти никакой информации о том, было ли это резервное копирование и нет установки Py2, но в Python 3, e
имеет атрибут e.__context__
, так что:
try:
try:
raise Exception("in the try")
finally:
raise Exception("in the finally")
except Exception as e:
print(repr(e.__context__))
дает:
Exception('in the try',)
В соответствии с PEP 3314 перед добавлением __context__
информация об исходном исключении была недоступна.
Ответ 2
try:
try:
raise Exception("in the try")
except Exception, e:
print "try block failed"
finally:
raise Exception("in the finally")
except Exception, e:
print "finally block failed: %s" % (e,)
Однако было бы неплохо избежать использования кода, который может вызвать исключение в блоке finally
- обычно вы просто используете его для очистки и т.д. в любом случае.