Dieses Mal möchte ich über die Verwendung einer Instanz einer Python-Ausnahmeklasse direkt als Argument der Ausnahmeklasse sprechen, aber in erster Linie
Ich bin mir nicht sicher über die Situation "** Eine Instanz der Ausnahmeklasse direkt als Argument der Ausnahmeklasse erstellen **".
Ich bin mir sicher, dass es Leute gibt, die das sagen, also lassen Sie uns eine etwas spezifischere Situation festlegen.
Nehmen wir zunächst an, Sie haben in Python ein Spam-Modul erstellt, "SpamError" als Basisklasse für Modulausnahmen vorbereitet und eine benutzerdefinierte Ausnahmeklasse "SpamIndexError" erstellt, die "SpamError" und den Python-Standard "IndexError" geerbt hat.
Es sieht so aus, wenn Sie es tatsächlich schreiben.
spam.py
class SpamError(Exception):
pass
class SpamIndexError(SpamError, IndexError):
pass
Aufgrund der Anforderung, dass Benutzer, die das Spam-Modul verwenden, den im Spam-Modul aufgetretenen Python-Standardfehler mit außer spam.SpamError als Ausnahme:
usw. im Spam-Modul ergänzen können
spam.py
try:
[][0] #Indexfehler tritt auf
except IndexError as original:
raise SpamIndexError(original) from original
Ich habe beschlossen, Code wie diesen zu schreiben. In der letzten Zeile ist das Argument von "SpamError" "original". Dies ist eine Ausnahme, die durch die Ausnahme-Anweisung ergänzt wird, da die Nachricht angezeigt werden soll, die dem ursprünglichen "IndexError" entspricht. Dies ist in vielen Quellen üblich.
Wenn ich den obigen Code ausführe,
python
Traceback (most recent call last):
File "./spam.py", line 16, in <module>
[][0] #Indexfehler tritt auf
IndexError: list index out of range
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./spam.py", line 18, in <module>
raise SpamIndexError(original) from original
spam.SpamIndexError: list index out of range
Wird angezeigt. Sowohl "IndexError" als auch "SpamIndexError" werden als "Listenindex außerhalb des Bereichs" angezeigt. Bisher gibt es kein Problem.
Aber leider, wenn dies ein "KeyError" anstelle eines "IndexError" war
python
Traceback (most recent call last):
File "./spam.py", line 16, in <module>
{}[0] #KeyError tritt auf
KeyError: 0
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./spam.py", line 18, in <module>
raise SpamKeyError(original) from original
spam.SpamKeyError: KeyError(0,)
Wird so angezeigt.
Der ursprüngliche "KeyError" wird als "KeyError: 0" angezeigt, der "SpamKeyError" jedoch als "spam.SpamKeyError: KeyError (0,)".
IndexError
wertet das Argument mit str ()
aus, aber KeyError
wertet mit repr ()
aus, wenn es ein Argument gibt, also ist dies der Fall.
Um es zu umgehen
python
raise SpamKeyError(original) from original
Linie,
python
raise SpamKeyError(*original.args) from original
Nehmen Sie anstelle von "original" das Argument der ursprünglichen Ausnahme "* original.args". Dann
python
Traceback (most recent call last):
File "./spam.py", line 16, in <module>
{}[0] #KeyError tritt auf
KeyError: 0
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "./spam.py", line 18, in <module>
raise SpamKeyError(*original.args) from original
spam.SpamKeyError: 0
Wird angezeigt und SpamKeyError
wird auf die gleiche Weise wie der ursprüngliche KeyError
angezeigt.
Es ist jedoch nur in Ordnung, "* original.args" als Argument zu verwenden, wenn die von Ihnen ausgelöste Ausnahme von der Klasse der ursprünglichen Ausnahme erbt. Wenn nicht,
python
raise SpamError(str(original)) from original
Es ist sicher, die ergänzten Ausnahmen in "str ()" einzuschließen und die Zeichenfolge als Argument zu erzwingen.
Wenn Sie eine Ausnahmeklasse auslösen möchten, die einfach von der Ausnahmeklasse erbt,
python
raise SpamError(original) from original
Es ist in Ordnung zu sagen, dass Sie es nicht in "str ()" wie einschließen müssen, aber in diesem Fall wird die Ausnahme, die als "KeyError: 0" angezeigt wurde, als "spam.SpamError: 0" angezeigt. Daher wird es schwierig zu verstehen, um welche Art von Fehler es sich bei der Nachricht handelt.
In jedem Fall wäre es eine schlechte Idee, nur die Ausnahmeklasseninstanz "original" als Argument zu verwenden.