2015-01-17 5 views
6

Die Python 2 documentation besagt, dass "Programmierer aufgefordert werden, neue Ausnahmen von der Exception-Klasse oder einer seiner Unterklassen abzuleiten, und nicht von BaseException". Ohne weitere Erklärung, warum.Warum wird empfohlen, in Python von der Exception- statt von der BaseException-Klasse abzuleiten?

Ich bin neugierig, warum es auf diese Weise empfohlen wird? Ist es nur, um die exceptions hierarchy zu erhalten, als Python-Entwickler es sich vorgestellt?

>>> dir(BaseException) == dir(Exception) 
True 
+2

[PEP 352] (https://www.python.org/dev/peps/pep-0352/) erklärt es ziemlich genau. –

Antwort

10

Ausnahmen von BaseException ableiten: GeneratorExit, KeyboardInterrupt, SystemExit.

Nach der Dokumentation:

  • GeneratorExit: Wird ausgelöst, wenn ein enger des Generators() -Methode aufgerufen wird. Es erbt direkt von BaseException anstelle von StandardError, da es technisch gesehen kein Fehler ist.
  • KeyboardInterrupt: Wird ausgelöst, wenn der Benutzer die Interrupt-Taste drückt (normalerweise Control-C oder Delete). Während der Ausführung wird regelmäßig nach Interrupts gesucht. Interrupts, die eingegeben werden, wenn eine integrierte Funktion input() oder raw_input() auf Eingabe wartet, löst diese Ausnahme ebenfalls aus. Die Ausnahme erbt von BaseException, damit sie nicht versehentlich von Code abgefangen wird, der Exception abfängt und somit verhindert, dass der Interpreter beendet wird.
  • SystemExit: Die Ausnahme erbt von BaseException anstelle von StandardError oder Exception, sodass sie nicht versehentlich von Code abgefangen wird, der Exception abfängt. Dies ermöglicht es der Ausnahme, ordnungsgemäß zu propagieren und den Interpreter zu beenden.

So sind die üblichen Gründe sind try ... except Exception zu verhindern versehentliches verhindern Dolmetscher Ausgang (außer GeneratorExit)

UPDATE nach Ashwini Chaudhary Kommentar zu sehen:

PEP 352 - Required Superclass for Exceptions erklärt den Grund.

Da die Ausnahmehierarchie jetzt noch wichtiger ist, da sie einen Basisstamm hat, wird eine Änderung der vorhandenen Hierarchie aufgerufen. Wie es jetzt steht, wenn man alle Ausnahmen abfangen will, die einen Fehler signalisieren und nicht bedeuten, dass der Interpreter beendet werden darf, müssen alle außer zwei Ausnahmen speziell in einer except-Klausel angeben oder die zwei Ausnahmen getrennt erfassen und dann wieder heben sie und haben alle anderen Ausnahmen fallen bis hin zu einer bloßen Ausnahme-Klausel:

except (KeyboardInterrupt, SystemExit): 
    raise 
except: 
    ... 

Das unnötig explizit ist. Dieser PEP schlägt vor, dass KeyboardInterrupt und SystemExit direkt von BaseException erben.

Verwandte Themen