Antworten:
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 sich args[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 eine UnicodeDecodeError
. Wenn Sie die Codierung der Ausnahme nicht kennen (und die meiste Zeit nicht), sollten Sie entweder daran arbeiten repr(e)
oder, wenn Sie es wirklich brauchen, einen anderen Try-Except-Block in Ihrer Ausnahmebehandlung verwenden, der UnicodeDecodeErrors abfängt und auf zurückgreift repr(e)
.
str
(oder sogar unicode
oder .format
) Fehler aufgrund der Unicode-Behandlung verursacht wurden. Wenn Sie den Inhalt der Fehlermeldung nicht vollständig kontrollieren können, verwenden Sie IMMER repr
, um unerwartete Unicode-Fehler zu vermeiden.
Verwenden Sie repr () und Der Unterschied zwischen repr und str
Verwenden von repr
:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
Verwenden von str
:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
repr
ist nützlich, danke, es scheint alles andere unicode
, str
Codierung, ... kann je nach Eingabe eine Ausnahme auslösen. Nicht ganz nützlich, wenn man versucht, die Ausnahme exception-safe
str()
ähnlichen Lösungen, da es tatsächlich die Art der Ausnahme enthält. Mit str()
bekam ich 'status'
während mit repr()
bekam ich KeyError('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, oder traceback.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.
Ein anderer Weg wurde noch nicht gegeben:
try:
1/0
except Exception, e:
print e.message
Ausgabe:
integer division or modulo by zero
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ührenden u
Unicode zurückgegeben:
'integer division or modulo by zero'
repr(e)
gibt die vollständige Ausnahmedarstellung an, die wahrscheinlich nicht Ihren Wünschen entspricht:
"ZeroDivisionError('integer division or modulo by zero',)"
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 mit e.args
und str(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 , indem str(e)
umgeben wird die Nachricht mit u''
.
Aber mit MySQLdb
der richtigen Art und Weise die Nachricht abzurufen ist e.args[1]
: e.message
leer ist , und str(e)
wird angezeigt'(ERR_CODE, "ERR_MSG")'
Für Python2 ist es besser e.message
, die Ausnahmemeldung abzurufen. Dies wird vermieden UnicodeDecodeError
. Aber ja e.message
wird für einige Ausnahmen wie leer sein. OSError
In diesem Fall können wir exc_info=True
unserer Protokollierungsfunktion eine hinzufügen , um den Fehler nicht zu verpassen.
Für Python3 halte ich es für sicher str(e)
.
Um die Fehlermeldung zu überprüfen und etwas damit zu tun (mit Python 3) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}