Вопрос

Я учусь использовать 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 есть какая-либо идея «приоритета».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top