Почему исключения Python называются «Ошибка»?

82

Почему исключения Python под названием "Error" (например ZeroDivisionError, NameError, TypeError) , а не "Exception" (например ZeroDivisionException, NameException,TypeException ).

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

Есть ли разница в Python или нет?

Елена
источник

Ответы:

95
  1. Вы не называете каждый класс «Class» в имени, а каждую переменную - «_variable» в имени. Точно так же вы не называете исключение словом «Исключение». Имя должно что-то говорить о значении объекта. «Ошибка» означает большинство исключений.

  2. Не все исключения являются ошибками. SystemExit, KeyboardInterrupt, StopIteration, GeneratorExitВсе исключения и не ошибки. Слово «Ошибка» в фактических ошибках показывает разницу.

  3. «Ошибка» короче, чем «Исключение». Это может сэкономить несколько символов в ширине кода без потери смысла. Это имеет значение.

Яцек Конечны
источник
2
Не все исключения являются ошибками : действительно, существует ряд исключений, производных от указанного класса исключений Warning. Пожалуйста, посмотрите мой ответ .
DavidRR
1
Это отличная визуализация docs.python.org/2/library/exceptions.html#exception-hierarchy
Джейсон Каприотти,
1
Актуальная визуализация для Python3 находится здесь: docs.python.org/3.6/library/exceptions.html#exception-hierarchy
Себастьян Джиланки
49

Я считаю, что это соглашение взято из PEP 8 - Style Guide for Python Code :

Имена исключений

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

Daotoad
источник
8

В этом отношении Python очень похож на Java. Но Python Exception следует сравнить с Java Throwable.

Поскольку Throwables бывают всевозможных разновидностей - Error, RuntimeException и (проверено) Exception - то же самое и с Python (хотя никаких проверенных исключений).

Что касается языка, ошибка является исключительной, так что иерархия наследования не является странной.

Хотя мне не очень нравится название Exception. Исключения используются не только для исключительных обстоятельств (например, ошибок, надеюсь), но и для того, чтобы просто выйти из потока управления. Потому что это то, что делает исключение; он переходит из обычного потока управления в отмеченную точку. Немного похоже на goto, но более изысканно.

Тем не менее, каждый раз, когда у вас возникает ситуация, в которой невозможно найти подходящее возвращаемое значение, вы склонны использовать исключение. И в Python, и в Java.

посторонний
источник
-1; Я не думаю, что это дает какую-либо полезную информацию. Вы говорите об «исключительных обстоятельствах» без их четкого определения, вы даете описание того, как работают исключения («выпрыгивайте из нормального потока управления в отмеченную точку»), что на самом деле неточно, вы вызываете различие между ошибкой и RuntimeException в Java, как если бы какое-то подобное различие существует в Python (а это не так), и вы никогда не решаете вопрос, почему исключения Python часто встречаются Errorв своем имени.
Марк Эмери
4

В. Почему исключения Python называются «Ошибка»?

Я предполагаю, что это связано с тем, что большинство исключений Python классифицируются как ошибки или предупреждения . Если бы имена исключений Python заканчивались на Exception, это различие было бы невозможно.

Примеры предупреждений: DeprecationWarningи ImportWarning.

Пожалуйста , обратитесь к иерархии классов 2.х для встроенных исключений , а также , что для 3.x .

DavidRR
источник
3

Проще говоря:

  • Исключения Python НЕ называются «Ошибка».
  • Ошибки Python называются «Ошибка».
  • Ошибки Python могут вызываться, обнаруживаться и обрабатываться как исключения.
  • То, что начинается как ошибка, может оказаться обработанным исключением, которое не приводит к появлению сообщения об ошибке.
  • ExceptionТакже может быть поднят напрямую

Концепция:

Я обычно так делаю, но сделаю исключение

ИЛИ ЖЕ

Обычно это ошибка, но мы собираемся сделать исключение, поймать его и выполнить некоторую процедуру.

Детали:

Исключения против ошибок:

https://docs.python.org/2/tutorial/errors.html

Ошибки, обнаруженные во время выполнения, называются исключениями и не являются безусловно фатальными.

Рабочий процесс:

  • Программа отслеживает ошибки.
  • Если ошибка возникает, но НЕ обнаруживается программой во время выполнения, появляется сообщение об ошибке.
  • Если ошибка возникает и обнаруживается программой во время выполнения, это исключение.
  • Программа может обрабатывать исключения. Они могут обрабатываться изящно или приводить к появлению сообщения об ошибке.
  • Исключения, которые НЕ обрабатываются программой, являются необработанными ( неперехваченными ) исключениями и становятся сообщениями об ошибках.
Ксавье
источник
1

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

Gustafc
источник
Базовый класс называется Exception (см. Мой комментарий к другому ответу), так почему бы не назвать и дочерние исключения Exception?
Елена
@Elena: Потому что тогда у вас, наконец, будет что-то вроде, class ExceptionHandlingException extends RuntimeExceptionи это просто ужасно читать.
Эско
2
Помимо других причин, опубликованных другими, имейте в виду, что именование в стандартной библиотеке Python не всегда согласовано.
gustafc