Wenn ich diesen Code habe:
try:
some_method()
except Exception, e:
Wie kann ich diesen Ausnahmewert erhalten (Zeichenfolgendarstellung meine ich)?
verwenden str
try:
some_method()
except Exception as e:
s = str(e)
Außerdem haben die meisten Ausnahmeklassen ein args
Attribut. Oft args[0]
wird eine Fehlermeldung angezeigt.
Es sollte beachtet werden, dass nur using str
eine leere Zeichenfolge repr
zurückgibt, wenn keine Fehlermeldung angezeigt wird, während bei Verwendung als pyfunc empfohlen zumindest die Klasse der Ausnahme angezeigt wird. Ich gehe davon aus, dass es beim Ausdrucken für einen Endbenutzer ist, dem es egal ist, um welche Klasse es sich handelt, und der nur eine Fehlermeldung wünscht.
Es hängt wirklich von der Klasse der Ausnahmen ab, mit denen Sie es zu tun haben, und davon, wie sie instanziiert werden. Hattest du etwas Besonderes im Sinn?
e.message
da es sichargs[0]
möglicherweise nicht um eine Nachricht handelt.raise Exception(u'jörn')
. Der Fehler ist besonders schlimm, da Sie nie die eigentliche Ausnahme sehen werden, sondern nur eineUnicodeDecodeError
. Wenn Sie die Codierung der Ausnahme nicht kennen (und die meiste Zeit nicht), sollten Sie entweder daran arbeitenrepr(e)
oder, wenn Sie es wirklich brauchen, einen anderen Try-Except-Block in Ihrer Ausnahmebehandlung verwenden, der UnicodeDecodeErrors abfängt und auf zurückgreiftrepr(e)
.str
(oder sogarunicode
oder.format
) Fehler aufgrund der Unicode-Behandlung verursacht wurden. Wenn Sie den Inhalt der Fehlermeldung nicht vollständig kontrollieren können, verwenden Sie IMMERrepr
, um unerwartete Unicode-Fehler zu vermeiden.Verwenden von
repr
:Verwenden von
str
:quelle
repr
ist nützlich, danke, es scheint alles andereunicode
,str
Codierung, ... kann je nach Eingabe eine Ausnahme auslösen. Nicht ganz nützlich, wenn man versucht, die Ausnahmeexception-safe
str()
ähnlichen Lösungen, da es tatsächlich die Art der Ausnahme enthält. Mitstr()
bekam ich'status'
während mitrepr()
bekam ichKeyError('status')
und ich war wie "aaaaah, jetzt verstehe ich den Fehler".Obwohl mir klar ist, dass dies eine alte Frage ist, möchte ich vorschlagen, das
traceback
Modul für die Ausgabe der Ausnahmen zu verwenden.Verwenden
traceback.print_exc()
Sie diese Option, um die aktuelle Ausnahme als Standardfehler zu drucken, so wie sie gedruckt würde, wenn sie nicht erfasst würde, odertraceback.format_exc()
um dieselbe Ausgabe wie eine Zeichenfolge zu erhalten. Sie können verschiedene Argumente an eine dieser Funktionen übergeben, wenn Sie die Ausgabe einschränken oder den Druck auf ein dateiähnliches Objekt umleiten möchten.quelle
Ein anderer Weg wurde noch nicht gegeben:
Ausgabe:
args[0]
könnte eigentlich keine Nachricht sein.str(e)
Möglicherweise wird der String mit umgebenden Anführungszeichen und möglicherweise mit dem führendenu
Unicode zurückgegeben:repr(e)
gibt die vollständige Ausnahmedarstellung an, die wahrscheinlich nicht Ihren Wünschen entspricht:bearbeiten
Mein Fehler !!! Es scheint, dass
BaseException.message
es veraltet ist2.6
, schließlich scheint es definitiv immer noch keine standardisierte Möglichkeit zu geben, Ausnahmemeldungen anzuzeigen. Also habe ich die beste Vermutung ist , viel zu tun mite.args
undstr(e)
je nach Bedarf (und möglicherweise ,e.message
wenn die lib Sie auf diesen Mechanismus verwenden , setzt).Zum Beispiel mit
pygraphviz
,e.message
ist der einzige Weg , richtig die Ausnahme angezeigt werden , indemstr(e)
umgeben wird die Nachricht mitu''
.Aber mit
MySQLdb
der richtigen Art und Weise die Nachricht abzurufen iste.args[1]
:e.message
leer ist , undstr(e)
wird angezeigt'(ERR_CODE, "ERR_MSG")'
quelle
Für Python2 ist es besser
e.message
, die Ausnahmemeldung abzurufen. Dies wird vermiedenUnicodeDecodeError
. Aber jae.message
wird für einige Ausnahmen wie leer sein.OSError
In diesem Fall können wirexc_info=True
unserer Protokollierungsfunktion eine hinzufügen , um den Fehler nicht zu verpassen.Für Python3 halte ich es für sicher
str(e)
.quelle
Wenn Sie den Typ / Ursprung des Fehlers nicht kennen, können Sie Folgendes versuchen:
Beachten Sie jedoch, dass Sie eine pep8-Warnung erhalten:
quelle
Um die Fehlermeldung zu überprüfen und etwas damit zu tun (mit Python 3) ...
quelle