Чому винятки 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
Оновлена ​​візуалізація для Python3 тут: docs.python.org/3.6/library/exceptions.html#exception-hierarchy
Себастьян Джиланкі

49

Я вважаю, що ця умова походить від PEP 8 - Керівництво стилем для коду Python :

Імена винятків

Оскільки винятками повинні бути класи, тут застосовується конвенція про іменування класів. Однак слід використовувати суфікс "Помилка" в іменах винятків (якщо виняток насправді є помилкою).


8

У цьому відношенні Python досить схожий на Java. Але виняток Python слід порівнювати з Java Throwable.

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

Що стосується мови, то помилка є винятковою, тому ієрархія успадкування не є дивною.

Мені не дуже подобається назва Виняток. Винятки використовуються не лише для виняткових обставин (наприклад, помилок), а й для того, щоб просто вийти з потоку управління. Тому що це те, що робить виняток; він вискакує з нормального потоку управління до позначеної точки. Трохи схожий на goto, але більш вишуканий.

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


-1; Я не відчуваю, що це дає корисне розуміння. Ви говорите про "виняткові обставини", не чітко їх визначаючи, ви даєте опис того, як працюють винятки ("вистрибнути з нормального потоку контролю до позначеної точки"), що насправді не є точним, ви посилаєтесь на різницю між Помилка та RuntimeException у Java, ніби якась подібна відмінність існує в Python (вона не існує), і ви ніколи фактично не вирішуєте питання, чому винятки Python часто мають Errorу своєму імені.
Mark Amery

4

З. Чому винятки Python називаються “Помилка”?

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

Прикладами попереджень є DeprecationWarningта ImportWarning.

Будь ласка , зверніться до ієрархії класів 2.х для вбудованих винятків , а також , що для 3.x .


3

Простіше кажучи:

  • Винятки Python НЕ називаються "Помилка".
  • Помилки Python називаються "Помилка".
  • Помилки Python можна викликати, ловити та обробляти як винятки.
  • Щось, що починається як помилка, може закінчитися обробкою винятком, що не призводить до повідомлення про помилку.
  • Ан Exceptionтакож можна підняти безпосередньо

Концепція:

Я зазвичай роблю це, але збираюся зробити виняток

АБО

Зазвичай це помилка, але ми збираємось зробити виняток, вловити його та виконати певну процедуру.

Подробиці:

Винятки проти помилок:

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

Помилки, виявлені під час виконання, називаються винятками і не є безумовно фатальними

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

  • Програма стежить за помилками.
  • Якщо помилка виникає, але програма НЕ виявляє її під час виконання, це призводить до повідомлення про помилку.
  • Якщо помилка виникає і виявляється програмою під час виконання, це виняток.
  • Програма може вирішувати винятки. З ними можна обробляти витончено або призвести до повідомлення про помилку.
  • Винятки, які НЕ обробляються програмою, є необробленими ( незахопленими ) винятками та стають повідомленнями про помилки.

1

Це просто найменування. У Java ви java.lang.Errorвідрізняєтеся від інших Throwables, оскільки такі помилки потрібно відмінити. У Python усі винятки не позначені, тому розрізнення начебто безглуздо.


Базовий клас називається Exception (див. Мій коментар до іншої відповіді), так чому б і дітям не назвати Exception?
Олена

@ Елена: Тому що тоді ви нарешті отримаєте щось подібне, class ExceptionHandlingException extends RuntimeExceptionі це просто жахливо читати.
Еско

2
Окрім інших причин, опублікованих іншими, майте на увазі, що імена в стандартній бібліотеці Python не завжди узгоджуються.
gustafc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.