повторный запуск исключения python.Что ловить?
Вопрос
Я учусь использовать python.Я только что наткнулся на эту статью:http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html В нем описывается повторное создание исключений в python, например, следующим образом:
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
Поскольку вы повторно генерируете исключение, должен быть оператор "outer catch-except".Но сейчас я задумался.Что делать, если do_something_to_apologize() внутри except выдает ошибку.Какой из них будет пойман во внешнем "catch-except"?Тот, который вы повторно выбрасываете, или тот, который выбрасывается do_something_to_apologize() ?Или исключение с наивысшим приоритетом будет перехвачено первым?
Решение
Попробуй и увидишь:
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
пункт.Исходное исключение упоминается в обратной трассировке, но включено в более позднюю версию и больше не может быть перехвачено.
Другие советы
Исключение, брошенное с помощью do_something_to_apologive ().Линия, содержащая рейз, никогда не будет работать, из-за исключения, брошенного do_something_to_apologive.Кроме того, я не верю, что в исключениях Python есть какая-либо идея «приоритета».