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

Что повышает рейз в Python?

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

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

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

4b9b3361

Ответ 1

На 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.

Ответ 2

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

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