Warum heißen Python-Ausnahmen "Fehler"?

82

Warum Python Ausnahmen genannt "Error" (zB ZeroDivisionError, NameError, TypeError) und nicht "Exception" (zB ZeroDivisionException, NameException, TypeException).

Ich komme aus Java und habe kürzlich angefangen, Python zu lernen. Daher ist dies verwirrend, da in Java zwischen Fehlern und Ausnahmen unterschieden wird.

Gibt es auch einen Unterschied in Python oder nicht?

Elena
quelle

Antworten:

95
  1. Sie benennen nicht jede Klasse mit dem Namen 'Class' und jede Variable mit dem Namen '_variable'. Auf die gleiche Weise benennen Sie Ausnahmen nicht mit dem Wort "Ausnahme". Ein Name sollte etwas über die Bedeutung eines Objekts aussagen. "Fehler" ist die Bedeutung der meisten Ausnahmen.

  2. Nicht alle Ausnahmen sind Fehler. SystemExit, KeyboardInterrupt, StopIteration, GeneratorExitSind alle Ausnahmen und keine Fehler. Das Wort "Fehler" in tatsächlichen Fehlern zeigt den Unterschied.

  3. 'Fehler' ist kürzer als 'Ausnahme'. Dadurch können einige Zeichen in der Codebreite ohne Bedeutungsverlust eingespart werden. Das macht einen Unterschied.

Jacek Konieczny
quelle
2
Nicht alle Ausnahmen sind Fehler : In der Tat gibt es eine Reihe von Ausnahmen, die von einer Ausnahmeklasse mit dem Namen abgeleitet sind Warning. Bitte sehen Sie meine Antwort .
DavidRR
1
Dies ist eine großartige Visualisierung docs.python.org/2/library/exceptions.html#exception-hierarchy
Jason Capriotti
1
Die aktuelle Visualisierung für Python3 finden Sie hier: docs.python.org/3.6/library/exceptions.html#exception-hierarchy
Sebastian Jylanki
49

Ich glaube, diese Konvention stammt aus PEP 8 - Style Guide für Python-Code :

Ausnahmenamen

Da Ausnahmen Klassen sein sollten, gilt hier die Klassennamenskonvention. Sie sollten jedoch das Suffix "Fehler" für Ihre Ausnahmenamen verwenden (wenn die Ausnahme tatsächlich ein Fehler ist).

daotoad
quelle
8

Python ist Java in dieser Hinsicht ziemlich ähnlich. Aber Pythons Ausnahme sollte mit Javas Throwable verglichen werden.

Da Throwables in allen möglichen Varianten erhältlich sind - Fehler, RuntimeException und (aktivierte) Ausnahme - gilt dies auch für Pythons (obwohl keine aktivierten Ausnahmen).

In Bezug auf die Sprache ist ein Fehler außergewöhnlich, sodass die Vererbungshierarchie nicht ungewöhnlich ist.

Ich mag den Namen Exception allerdings nicht besonders. Ausnahmen werden nicht nur für außergewöhnliche Umstände (wie hoffentlich Fehler) verwendet, sondern auch, um einfach aus dem Kontrollfluss herauszukommen. Denn genau das macht eine Ausnahme. es springt aus dem normalen Kontrollfluss zu einem markierten Punkt. Ein bisschen wie ein Goto, aber raffinierter.

Das heißt, jedes Mal, wenn Sie eine Situation haben, in der kein geeigneter Rückgabewert gefunden werden kann, neigen Sie dazu, eine Ausnahme zu verwenden. Sowohl in Python als auch in Java.

Extraneon
quelle
-1; Ich glaube nicht, dass dies nützliche Einblicke bietet. Sie sprechen von "außergewöhnlichen Umständen", ohne sie klar zu definieren, und geben eine Beschreibung der Funktionsweise von Ausnahmen ("Sprung aus dem normalen Kontrollfluss zu einem markierten Punkt"), die nicht wirklich genau ist. Sie rufen die Unterscheidung zwischen Fehler und auf RuntimeException in Java, als ob in Python eine ähnliche Unterscheidung besteht (dies ist nicht der Fall), und Sie sprechen nie die Frage an, warum Pythons Ausnahmen häufig Errorin ihrem Namen enthalten sind.
Mark Amery
4

F. Warum werden Python-Ausnahmen als "Fehler" bezeichnet?

Ich vermute, das liegt daran, dass die meisten Python-Ausnahmen entweder als Fehler oder als Warnungen klassifiziert sind . Wenn die Namen der Python-Ausnahmen enden würden Exception, wäre diese Unterscheidung nicht möglich.

Beispiele für Warnungen sind DeprecationWarningund ImportWarning.

Bitte beachten Sie die die 2.x Klassenhierarchie für eingebaute Ausnahmen sowie die für 3.x .

DavidRR
quelle
3

Einfach gesagt:

  • Python-Ausnahmen heißen NICHT "Fehler".
  • Python-Fehler werden als "Fehler" bezeichnet.
  • Python-Fehler können als Ausnahmen ausgelöst, abgefangen und behandelt werden.
  • Etwas, das als Fehler beginnt, kann eine behandelte Ausnahme sein, die nicht zu einer Fehlermeldung führt.
  • Ein Exceptionkann auch direkt angehoben werden

Konzept:

Normalerweise mache ich das, aber ich werde eine Ausnahme machen

ODER

Dies wäre normalerweise ein Fehler, aber wir werden eine Ausnahme machen, sie abfangen und eine Prozedur ausführen.

Einzelheiten:

Ausnahmen gegen Fehler:

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

Während der Ausführung erkannte Fehler werden als Ausnahmen bezeichnet und sind nicht unbedingt schwerwiegend

Arbeitsablauf:

  • Das Programm überwacht auf Fehler.
  • Wenn ein Fehler auftritt, der jedoch während der Ausführung vom Programm NICHT erkannt wird, wird eine Fehlermeldung angezeigt.
  • Wenn ein Fehler auftritt und vom Programm während der Ausführung erkannt wird, ist dies eine Ausnahme.
  • Ausnahmen können vom Programm behandelt werden. Sie können ordnungsgemäß behandelt werden oder zu einer Fehlermeldung führen.
  • Ausnahmen, die NICHT vom Programm behandelt werden, sind nicht behandelte ( nicht erfasste ) Ausnahmen und werden zu Fehlermeldungen.
Xavier
quelle
1

Es ist nur eine Benennung. In Java unterscheiden Sie sich java.lang.Errorvon anderen Throwables, da diese Art von Fehlern deaktiviert werden muss. In Python sind alle Ausnahmen deaktiviert, daher ist die Unterscheidung irgendwie sinnlos.

gustafc
quelle
Die Basisklasse heißt Exception (siehe meinen Kommentar zur anderen Antwort). Warum also nicht auch die untergeordnete Exception benennen?
Elena
@Elena: Weil du dann endlich so etwas haben würdest class ExceptionHandlingException extends RuntimeExceptionund das ist einfach schrecklich zu lesen.
Esko
2
Beachten Sie neben anderen von anderen veröffentlichten Gründen, dass die Benennung in der Python-Standardbibliothek nicht immer konsistent ist.
Gustafc