Ich habe diesen try
Block in meinem Code:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise ValueError(errmsg)
Genau genommen ziehe ich tatsächlich einen anderen auf ValueError
, nicht den ValueError
von do_something...()
, der err
in diesem Fall als geworfen bezeichnet wird. Wie hänge ich eine benutzerdefinierte Nachricht an err
? Ich versuche den folgenden Code, aber er schlägt fehl, weil err
eine ValueError
Instanz nicht aufrufbar ist:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise err(errmsg)
Antworten:
Update: Überprüfen Sie für Python 3 Bens Antwort
So hängen Sie eine Nachricht an die aktuelle Ausnahme an und lösen sie erneut aus: (Der äußere Versuch / die Ausnahme dient nur dazu, den Effekt anzuzeigen.)
Für Python 2.x mit x> = 6:
Dies wird auch das Richtige tun , wenn
err
sich ableiten ausValueError
. Zum BeispielUnicodeDecodeError
.Beachten Sie, dass Sie hinzufügen können, was Sie möchten
err
. Zum Beispielerr.problematic_array=[1,2,3]
.Bearbeiten: @Ducan zeigt in einem Kommentar, dass das oben Gesagte nicht mit Python 3 funktioniert, da
.message
es kein Mitglied von istValueError
. Stattdessen können Sie dies verwenden (gültiges Python 2.6 oder höher oder 3.x):Edit2:
Je nach Zweck können Sie die zusätzlichen Informationen auch unter Ihrem eigenen Variablennamen hinzufügen. Für Python2 und Python3:
quelle
print
, sollten Sie wahrscheinlich beachten, dass Ihr Code in Python 3.x nicht funktioniert, damessage
Ausnahmen kein Attribut enthalten.err.args = (err.args[0] + " hello",) + err.args[1:]
funktioniert möglicherweise zuverlässiger (und konvertiert dann einfach in eine Zeichenfolge, um die Nachricht zu erhalten)..message
Attributs hier irgendetwas bewirkt, ist, dass dieses Attribut explizit gedruckt wird. Wenn Sie die Ausnahme , ohne zu kontrollieren und den Druck zu erhöhen, würden Sie nicht das sehen.message
Attribut tun etwas Sinnvolles.Wenn Sie das Glück haben, nur Python 3.x zu unterstützen, wird dies wirklich zu einer Sache der Schönheit :)
erhöhen von
Wir können die Ausnahmen mit Raise from verketten .
In diesem Fall hat die Ausnahme, die Ihr Anrufer abfangen würde, die Zeilennummer des Ortes, an dem wir unsere Ausnahme auslösen.
Beachten Sie, dass die unterste Ausnahme nur den Stacktrace enthält, von dem aus wir unsere Ausnahme ausgelöst haben. Ihr Anrufer kann weiterhin die ursprüngliche Ausnahme erhalten, indem er auf das
__cause__
Attribut der Ausnahme zugreift, die er abfängt.with_traceback
Oder Sie können with_traceback verwenden .
Bei Verwendung dieses Formulars hat die Ausnahme, die Ihr Anrufer abfangen würde, den Traceback, von dem der ursprüngliche Fehler aufgetreten ist.
Beachten Sie, dass die unterste Ausnahme die Zeile enthält, in der wir die ungültige Division durchgeführt haben, sowie die Zeile, in der wir die Ausnahme erneut auslösen.
quelle
raise Exception('Smelly socks') from e
beispielsweise so geändert werden, dass nur "Smelly Socks" als Kommentar zum ursprünglichen Traceback hinzugefügt werden, anstatt einen eigenen neuen Traceback einzuführen.raise RuntimeError("Something bad happened") from None
Drucke:
quelle
raise
ohne Parameter wird neu angehoben. Wenn OP eine Nachricht hinzufügen möchte, muss er eine neue Ausnahme auslösen und kann die Nachricht / den Typ der ursprünglichen Ausnahme wiederverwenden.Es scheint, dass alle Antworten e.args [0] Informationen hinzufügen und dadurch die vorhandene Fehlermeldung ändern. Gibt es einen Nachteil beim Erweitern des Args-Tupels? Ich denke, der mögliche Vorteil ist, dass Sie die ursprüngliche Fehlermeldung für Fälle, in denen das Parsen dieser Zeichenfolge erforderlich ist, in Ruhe lassen können. Sie können dem Tupel mehrere Elemente hinzufügen, wenn Ihre benutzerdefinierte Fehlerbehandlung mehrere Meldungen oder Fehlercodes erzeugt, wenn der Traceback programmgesteuert analysiert wird (z. B. über ein Systemüberwachungstool).
oder
Können Sie einen Nachteil dieses Ansatzes erkennen?
quelle
Mit dieser Codevorlage sollten Sie eine Ausnahme mit einer benutzerdefinierten Nachricht auslösen können.
quelle
Lösen Sie entweder die neue Ausnahme mit Ihrer Fehlermeldung mit aus
oder
an der Stelle, an der Sie es auslösen möchten ODER die Fehlermeldung mit 'from' an die aktuelle Ausnahme anhängen (ersetzen) (nur Python 3.x wird unterstützt):
quelle
Dies ist die Funktion, mit der ich die Ausnahmemeldung in Python 2.7 und 3.x unter Beibehaltung des ursprünglichen Tracebacks ändere. Es benötigt
six
quelle
In Python 3 integrierte Ausnahmen haben das
strerror
Feld:quelle
Die aktuelle Antwort hat bei mir nicht gut funktioniert. Wenn die Ausnahme nicht erneut abgefangen wird, wird die angehängte Nachricht nicht angezeigt.
Wenn Sie jedoch wie unten beschrieben vorgehen, wird die Ablaufverfolgung beibehalten und die angehängte Nachricht angezeigt, unabhängig davon, ob die Ausnahme erneut abgefangen wird oder nicht.
(Ich habe Python 2.7 verwendet, habe es in Python 3 nicht ausprobiert.)
quelle
Keine der oben genannten Lösungen hat genau das getan, was ich wollte, nämlich dem ersten Teil der Fehlermeldung einige Informationen hinzuzufügen, dh ich wollte, dass meine Benutzer zuerst meine benutzerdefinierte Nachricht sehen.
Das hat bei mir funktioniert:
quelle
Dies funktioniert nur mit Python 3 . Sie können die ursprünglichen Argumente der Ausnahme ändern und Ihre eigenen Argumente hinzufügen.
Eine Ausnahme merkt sich die Argumente, mit denen sie erstellt wurde. Ich gehe davon aus, dass dies so ist, dass Sie die Ausnahme ändern können.
In der Funktion stellen
reraise
wir den ursprünglichen Argumenten der Ausnahme alle neuen Argumente voran, die wir möchten (wie eine Nachricht). Schließlich lösen wir die Ausnahme erneut aus, während der Rückverfolgungsverlauf beibehalten wird.Ausgabe
quelle
Wenn Sie den Fehlertyp anpassen möchten, können Sie einfach eine Fehlerklasse definieren, die auf ValueError basiert.
quelle