Повторное выбрасывание исключения питона. Что ловить?

Обновить

December 2018

Просмотры

22.1k раз

21

Я учусь использовать питон. Я просто наткнулся на эту статью: http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html Он описывает Повторное выбрасывание исключений в Python, как это:

try:
    do_something_dangerous()
except:
    do_something_to_apologize()
    raise

Так как вы повторно бросить исключение, там shouold быть «внешняя выгода, за исключением» заявления. Но теперь, я думаю. Что делать, если do_something_to_apologize () внутри, за исключением выдает ошибку. Какой из них будет пойман во внешнем «поймать, за исключением»? Один вы повторно выдать или один брошенный do_something_to_apologize ()? Или исключение с наивысшим priotiry быть пойманным первым?

2 ответы

6

Исключение брошенного do_something_to_apologize () будет поймано. Строка с рейзом никогда не будет работать из-за исключением брошенного do_something_to_apologize. Кроме того, я не считаю, что любая идея «приоритет» в исключения питона.

37

Попробуйте и убедитесь:

def failure():
    raise ValueError, "Real error"

def apologize():
    raise TypeError, "Apology error"

try:
    failure()
except ValueError:
    apologize()
    raise

Результат:

Traceback (most recent call last):
  File "<pyshell#14>", line 10, in <module>
    apologize()
  File "<pyshell#14>", line 5, in apologize
    raise TypeError, "Apology error"
TypeError: Apology error

Причина: «реальная» ошибка от исходной функции уже была поймана except. apologizeподнимает новую ошибку до того , как raiseбудет достигнуто . Таким образом, raiseв exceptпредложении никогда не выполняется, и только ошибка Извинения в распространении вверх. Если apologizeвозникает ошибка, Python не имеет возможности узнать , что вы собираетесь поднять различное исключение после apologize.

Обратите внимание , что в Python 3, отслеживающие упомянут как исключения, с сообщением , объясняющим , как возникла вторая одна:

Traceback (most recent call last):
  File "./prog.py", line 9, in <module>
  File "./prog.py", line 2, in failure
ValueError: Real error

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./prog.py", line 11, in <module>
  File "./prog.py", line 5, in apologize
TypeError: Apology error

Тем не менее, второе исключение ( «Апология» исключение) по- прежнему является единственным, который распространяется наружу и может быть перехвачен более высоким уровнем exceptпунктом. Оригинальное исключение упоминается в TRACEBACK а включается в более поздней и уже не может быть поймано.

Связанные вопросы