Dlaczego wyjątki Pythona mają nazwę „Błąd”?

82

Dlaczego Python wyjątki są nazwane "Error" (np ZeroDivisionError, NameError, TypeError) a nie "Wyjątek" (np ZeroDivisionException, NameException, TypeException).

Pochodzę z Javy i niedawno zacząłem uczyć się Pythona, ponieważ jest to zagmatwane, ponieważ w Javie istnieje różnica między błędami a wyjątkami.

Czy jest też różnica w Pythonie, czy nie?

Elena
źródło

Odpowiedzi:

95
  1. Nie nazywasz każdej klasy słowem „Class” w nazwie, a każdej zmiennej „_variable” w nazwie. W ten sam sposób nie nazywa się wyjątku słowem „Wyjątek”. Nazwa powinna mówić coś o znaczeniu przedmiotu. „Błąd” jest znaczeniem większości wyjątków.

  2. Nie wszystkie wyjątki są błędami. SystemExit, KeyboardInterrupt, StopIteration, GeneratorExitSą wyjątki i nie błędów. Słowo „Błąd” w rzeczywistych błędach pokazuje różnicę.

  3. „Błąd” jest krótszy niż „Wyjątek”. To może zaoszczędzić kilka znaków w szerokości kodu bez utraty znaczenia. To robi różnicę.

Jacek Konieczny
źródło
2
Nie wszystkie wyjątki są błędami : w rzeczywistości istnieje wiele wyjątków, które pochodzą z nazwanej klasy wyjątków Warning. Proszę zobaczyć moją odpowiedź .
DavidRR
1
To świetna wizualizacja docs.python.org/2/library/exceptions.html#exception-hierarchy
Jason Capriotti
1
Aktualna wizualizacja dla Pythona3 jest dostępna tutaj: docs.python.org/3.6/library/exceptions.html#exception-hierarchy
Sebastian Jylanki
49

Uważam, że ta konwencja pochodzi z PEP 8 - Style Guide for Python Code :

Nazwy wyjątków

Ponieważ wyjątki powinny być klasami, obowiązuje tutaj konwencja nazewnictwa klas. Jednak w nazwach wyjątków należy używać przyrostka „Błąd” (jeśli w rzeczywistości wyjątek jest błędem).

daotoad
źródło
8

Pod tym względem Python jest dość podobny do Javy. Ale wyjątek Pythona należy porównać do Throwable Javy.

Ponieważ elementy Throwables są dostępne w różnych odmianach - Error, RuntimeException i (Check) Exception - tak samo jest z Pythonem (choć nie ma zaznaczonych wyjątków).

Jeśli chodzi o język, błąd jest wyjątkowy, więc hierarchia dziedziczenia nie jest dziwna.

Nie podoba mi się jednak nazwa Exception. Wyjątki są używane nie tylko w wyjątkowych okolicznościach (takich jak, miejmy nadzieję, Błędy), ale także po to, aby wydostać się z przepływu kontroli. Ponieważ to właśnie robi Wyjątek; wyskakuje poza normalny przepływ kontroli do zaznaczonego punktu. Trochę jak goto, ale bardziej wyrafinowany.

To powiedziawszy, za każdym razem, gdy masz sytuację, w której nie można znaleźć odpowiedniej wartości zwracanej, zwykle używasz wyjątku. Zarówno w Pythonie, jak iw Javie.

extraneon
źródło
-1; Nie wydaje mi się, żeby to zapewniało jakiekolwiek przydatne informacje. Mówisz o „wyjątkowych okolicznościach” bez ich jasnego definiowania, podajesz opis działania wyjątków („wyskakiwanie z normalnego przepływu kontroli do zaznaczonego punktu”), który nie jest tak naprawdę dokładny, przywołujesz rozróżnienie między błędem a RuntimeException w Javie, tak jakby podobne rozróżnienie istniało w Pythonie (nie ma), i nigdy tak naprawdę nie rozwiązujesz pytania, dlaczego wyjątki Pythona często mają Errorw nazwie.
Mark Amery,
4

P. Dlaczego wyjątki Pythona mają nazwę „Błąd”?

Przypuszczam, że dzieje się tak, ponieważ większość wyjątków w Pythonie jest klasyfikowanych jako błędy lub ostrzeżenia . Gdyby nazwy wyjątków w Pythonie kończyły się naException , to rozróżnienie nie byłoby możliwe.

Przykładami ostrzeżeń są DeprecationWarningiImportWarning .

Proszę zapoznać się z klasy hierarchii 2.x dla wbudowanego wyjątkami , jak również, że dla 3.x .

DavidRR
źródło
3

Mówiąc najprościej:

  • Wyjątki w Pythonie NIE mają nazwy „Błąd”.
  • Błędy Pythona noszą nazwę „Błąd”.
  • Błędy Pythona mogą być zgłaszane, przechwytywane i obsługiwane jako wyjątki.
  • Coś, co zaczyna się jako błąd, może skończyć się obsłużonym wyjątkiem, który nie powoduje komunikatu o błędzie.
  • ExceptionMoże być podniesiony także bezpośrednio

Pojęcie:

Zwykle to robię, ale zrobię wyjątek

LUB

Zwykle byłby to błąd, ale zrobimy wyjątek, złapiemy go i wykonamy jakąś procedurę.

Detale:

Wyjątki a błędy:

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

Błędy wykryte podczas wykonywania nazywane są wyjątkami i nie są bezwarunkowo krytyczne

Przepływ pracy:

  • Program monitoruje błędy.
  • Jeśli wystąpi błąd, ale NIE zostanie wykryty przez program podczas wykonywania, spowoduje to wyświetlenie komunikatu o błędzie.
  • Jeśli wystąpi błąd i zostanie wykryty przez program podczas wykonywania, jest to wyjątek.
  • Wyjątki mogą być obsługiwane przez program. Mogą być obsługiwane z wdziękiem lub skutkować wyświetleniem komunikatu o błędzie.
  • Wyjątki, które NIE są obsługiwane przez program, są nieobsługiwanymi ( nieprzechwyconymi ) wyjątkami i stają się komunikatami o błędach.
Xavier
źródło
1

To tylko nazywanie. W Javie java.lang.Errorróżni się od innych, Throwableponieważ tego rodzaju błędy muszą być odznaczone. W Pythonie wszystkie wyjątki są odznaczone, więc rozróżnienie jest trochę bezcelowe.

gustafc
źródło
Klasa bazowa nazywa się Exception (zobacz mój komentarz do drugiej odpowiedzi), więc dlaczego nie nazwać również dzieci Exception?
Elena,
@Elena: Ponieważ wtedy w końcu skończyłbyś z czymś takim, class ExceptionHandlingException extends RuntimeExceptiona to jest po prostu okropne do przeczytania.
Esko
2
Oprócz innych powodów opublikowanych przez innych, należy pamiętać, że nazewnictwo w standardowej bibliotece Pythona nie zawsze jest spójne.
gustafc