python: восстановление исключения из блока try, если блок finally вызывает исключение


Допустим, у меня есть такой код:

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

С точки зрения этого оператора print, существует ли какой-либо способ получить доступ к исключению, вызванному в try, или оно исчезло навсегда?

Примечание: Я не имею в виду прецедент использования; это просто любопытство.
2 14

2 ответа:

Я не могу найти никакой информации о том, было ли это перенесено и не имеет установки 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__ информация об исходном исключении была недоступна.

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