Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!

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.

Recommended Posts

Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!
Skript zum Ändern der Beschreibung von Fasta
Skript zum Twittern mit Vielfachen von 3 und Zahlen mit 3 !!
Erstellen Sie eine AWS-GPU-Instanz, um StyleNet zu trainieren
Verwendung zum Aufrufen einer Methode einer Instanz, bevor sie von __new__ zurückgegeben wird
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
Format, wenn eine lange Zeichenfolge als Python-Argument übergeben wird
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor:
[Fabric] Ich war süchtig danach, Boolesche Werte als Argument zu verwenden. Notieren Sie sich also die Gegenmaßnahmen.
Python-Implementierung der Bayes'schen linearen Regressionsklasse
Warum ist das erste Argument der [Python] -Klasse selbst?
Hinweis: Bedeutung der Angabe von nur * (Sternchen) als Argument in der Funktionsdefinition von Python
Sehen Sie sich die in Python integrierte Ausnahmebaumstruktur an
[OCI] Python-Skript zum Abrufen der IP-Adresse einer Recheninstanz in Cloud Shell
So bestimmen Sie die Existenz eines Selenelements in Python
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
Wie Sie die interne Struktur eines Objekts in Python kennen
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Sehen Sie sich die in Python 3.8.2 integrierte Ausnahmebaumstruktur an
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Ich bin gestorben, weil ich dachte, eine Python-Klassenvariable sei eine Instanzvariable
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
Python Hinweis: Wenn Sie die Attribute eines Objekts kennen möchten
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
Python-Code zur Bestimmung der monatlichen Signale für Investitionen mit relativer Stärke
Holen Sie sich zu jeder Tageszeit eine Datums- / Uhrzeitinstanz in Python
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ein Beispiel für die Antwort auf die Referenzfrage der Studiensitzung. Mit Python.
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
[Python] Wie man eine Klasse iterierbar macht
[Python] Ruft eine Liste der Instanzvariablen ab
[Python] [Meta] Ist der Python-Typ ein Typ?
Die Geschichte der Verarbeitung A von Blackjack (Python)
<Python> Ein Quiz zum Batch-Konvertieren von Dateinamen, die durch eine bestimmte Zeichenfolge als Teil des Dateinamens getrennt sind
Geben Sie kein veränderbares Objekt (Listentyp, Wörterbuchtyp usw.) als Anfangswert des Funktionsarguments von Python an.
[Python] Umgang mit dem is-Instanzfehler "is instance () arg 2 muss ein Typ oder ein Tupel von Typen sein"
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
Python> Funktion> Beispiel für die Übernahme der Funktion als Argument> Karte (Lambda x: 2 ** x, [1, 2, 3]) / local () ['myprint'] (3.1415, 2.718)
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Sie können die Methode der Klasse direkt in Python3 aufrufen, ohne @staticmethod hinzuzufügen
[Python] Erstellt eine Klasse, um mit pyaudio Sinuswellen im Hintergrund zu spielen
[Python] So sortieren Sie nach dem N-ten M-ten Element eines mehrdimensionalen Arrays
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Speichern Sie das numpy-Array mithilfe des Wave-Moduls in einer WAV-Datei
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Python-Skript zum Abrufen einer Liste von Eingabebeispielen für den AtCoder-Wettbewerb