Исключения против ошибок в Python - PullRequest
0 голосов
/ 16 марта 2020

Я родом из Java, где исключения и ошибки - это совершенно разные вещи, и оба они происходят от того, что называется Throwable. В Java обычно вы никогда не должны пытаться обнаружить ошибку.

В Python хотя кажется, что различие размыто.

Пока что после прочтения некоторых документов и проверки иерархии У меня есть следующие вопросы:

  1. Есть синтаксические ошибки, которые, конечно, приводят к тому, что ваша программа вообще не может запускаться. Правильно?

  2. «Ошибки, обнаруженные во время выполнения, называются исключениями и не являются безусловно фатальными» (согласно руководства ). Что значит «фатальный» здесь? Кроме того, некоторые объекты, такие как AttributeError, (по вышеприведенному определению) на самом деле являются исключениями, даже если в их именах содержится ошибка, верно ли это заключение?

  3. Некоторые классы являются производными от Exception, но содержат в своем имени Error. Разве это не смущает? Но даже в этом случае это означает, что Ошибка в имени ни в коем случае не является особенной, это все же Исключение. Или нет... ?

  4. "Все встроенные, не выходящие из системы исключения получены из [Exception]" (цитата из здесь )
    Так, какие из них системных выходов исключений, а какие нет? Это не сразу понятно. Все определяемые пользователем исключения также должны быть получены из исключения. Так что, как новичку, мне нужно беспокоиться о чем-то еще, кроме исключения? Похоже, нет.

  5. Предупреждения также вытекают из исключения. Значит, предупреждения являются фатальными или системными или их нет?

  6. К чему вписывается AssertionError? Это фатальный или системный выход?

  7. Как узнать или указать, что некоторый класс Exception представляет собой фатальное или системное исключение?

1 Ответ

3 голосов
/ 16 марта 2020
  1. Да. SyntaxError не перехватывается, за исключением случаев динамически исполняемого кода (через eval / exec), потому что это происходит до того, как код на самом деле запущен.
  2. «Fatal» означает «программа умирает независимо от того, что написано в коде "; это не происходит с исключениями в Python, они все уловимы. os._exit может принудительно завершить процесс, но это происходит в обход механизма исключений.
  3. Нет разницы между исключениями и ошибками, поэтому номенклатура не имеет значения.
  4. Система- Выходящие исключения происходят из BaseException, но не Exception. Но они могут быть перехвачены так же, как и любое другое исключение
  5. Предупреждения ведут себя по-разному в зависимости от фильтра предупреждений, а вывод из Exception означает, что они не входят в категорию «выхода из системы»
  6. AssertionError это просто еще один Exception дочерний класс, так что это не «выход из системы». Это просто связано с оператором assert, который имеет особую семантику.
  7. Вещи, происходящие из BaseException, но не Exception (например, SystemExit, KeyboardInterrupt), "нецелесообразно ловить" ( или, если вы поймаете их, почти всегда следует регистрировать / выполнять очистку и повторно отбрасывать их), все остальное (также полученное из Exception) является «условно разумным для отлова». Других различий нет.

Для ясности, «выход из системы» - это просто способ сказать «вещи, которые except Exception: не поймают»; если блоки except не задействованы, все исключения (кроме предупреждений, которые, как отмечалось, ведут себя по-разному в зависимости от фильтра предупреждений), являются "выходом из системы".

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