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

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, или он исчез навсегда?

ПРИМЕЧАНИЕ. У меня нет случая использования; это просто любопытство.

4b9b3361

Ответ 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 - обычно вы просто используете его для очистки и т.д. в любом случае.