Definieren einer parameterlosen Ausnahme:
class MyException(Exception):
pass
Gibt es einen Unterschied zwischen:
raise MyException
und
raise MyException()
Ich konnte keine finden; ist es einfach eine überladene Syntax?
Definieren einer parameterlosen Ausnahme:
class MyException(Exception):
pass
Gibt es einen Unterschied zwischen:
raise MyException
und
raise MyException()
Ich konnte keine finden; ist es einfach eine überladene Syntax?
Antworten:
Die kurze Antwort ist, dass beide raise MyException
und raise MyException()
dasselbe tun. Dieses erste Formular instanziiert automatisch Ihre Ausnahme.
In dem entsprechenden Abschnitt aus den Dokumenten heißt es: " Raise wertet den ersten Ausdruck als Ausnahmeobjekt aus. Es muss sich entweder um eine Unterklasse oder eine Instanz von BaseException handeln. Wenn es sich um eine Klasse handelt, wird die Ausnahmeinstanz bei Bedarf durch Instanziieren der Klasse mit abgerufen keine Argumente. "
Das heißt, obwohl die Semantik dieselbe ist, ist die erste Form mikroskopisch schneller und die zweite Form flexibler (da Sie bei Bedarf Argumente übergeben können).
Der übliche Stil, den die meisten Benutzer in Python verwenden (dh in der Standardbibliothek, in gängigen Anwendungen und in vielen Büchern), ist die Verwendung, raise MyException
wenn keine Argumente vorhanden sind. Die Ausnahme wird nur dann direkt instanziiert, wenn einige Argumente übergeben werden müssen. Zum Beispiel : raise KeyError(badkey)
.
Schauen Sie sich die Dokumente für die raise
Anweisung an . Es wird eine Instanz von erstellt MyException
.
raise
in Python 3 etwas geändert hat. Der Teil, der für diese Frage relevant ist, ist jedoch derselbe ( raise ExceptionType
erstellt immer noch eine Instanz des Typs, indem der Konstruktor ohne Argumente aufgerufen wird).
Ja, es gibt einen Unterschied zwischen ValueError
undValueError()
ValueError
ist eine Klasse, während ValueError()
eine Instanz einer Klasse erstellt wird. Dies ist der Grund, warum type(ValueError) is type
undtype(ValueError()) is ValueError
Der einzige Zweck von raise
ist es, die Ausnahme zu erheben,
Wenn wir verwenden
ValueError
, wird eine Klasse aufgerufen, die wiederum den Konstruktor ausführtValueError()
Wenn wir verwenden
ValueError()
, wird die MethodeValueError()
direkt aufgerufen.
Hinweis: raise ValueError # shorthand for 'raise ValueError()'