На самом деле, другие ответы немного расплывчаты. Итак, позвольте мне уточнить это. Вы всегда можете вызвать sys.exc_info () из блока finally. Тем не менее, его вывод будет варьироваться в зависимости от того, было ли действительно возбуждено исключение.
import sys
def f(i):
try:
if i == 1:
raise Exception
except Exception as e:
print "except -> " + str(sys.exc_info())
finally:
print "finally -> " + str(sys.exc_info())
f(0)
f(1)
>>>
finally -> (None, None, None)
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>)
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>)
Таким образом, вы всегда можете узнать в блоке finally, было ли вызвано исключение, если это функция первого уровня. Но sys.exc_info () будет вести себя иначе, когда длина стека вызовов превышает 1, как показано в примере ниже. Для получения дополнительной информации см. Как работает sys.exc_info ()?
import sys
def f(i):
try:
if i == 1:
raise Exception
except Exception as e:
print "except -> " + str(sys.exc_info())
finally:
print "finally -> " + str(sys.exc_info())
def f1(i):
if i == 0:
try:
raise Exception('abc')
except Exception as e:
pass
f(i)
f1(0)
f1(1)
>>>
finally -> (<type 'exceptions.Exception'>, Exception('abc',), <traceback object at 0x02A33940>)
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>)
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>)
Надеюсь, это проясняет ситуацию.