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?

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ę.


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
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).


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.


-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 .


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.

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.