Что рейз в Python рейзит? - PullRequest
       4

Что рейз в Python рейзит?

29 голосов
/ 14 октября 2010

Рассмотрим следующий код:

try:
    raise Exception("a")
except:
    try:
        raise Exception("b")
    finally:
        raise

Это повысит Exception: a. Я ожидал, что это поднимет Exception: b (нужно объяснить почему?). Почему в финале raise поднялось исходное исключение, а не (как я думал) последнее исключение?

Ответы [ 2 ]

26 голосов
/ 15 октября 2010

Повышение вызывает повторное повышение последнего пойманного вами исключения, а не последнее исключение, которое вы подняли

(оставлено для комментариев для ясности)

14 голосов
/ 14 октября 2010

на python2.6

Полагаю, вы ожидаете, что блок finally будет связан с блоком "try", где вы вызываете исключение "B". Блок finally присоединяется к первому блоку try.

Если вы добавили блок исключений во внутренний блок try, то блок finally вызовет исключение B.

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    pass
  finally:
    raise

Выход:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    raise Exception("b")
Exception: b

Еще один вариант, объясняющий, что здесь происходит

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    raise

Выход:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    raise Exception("b")
Exception: b

Если вы видите здесь, замена блока finally с исключением вызывает исключение B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...