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