Abrufen des Ausnahmewerts in Python

239

Wenn ich diesen Code habe:

try:
    some_method()
except Exception, e:

Wie kann ich diesen Ausnahmewert erhalten (Zeichenfolgendarstellung meine ich)?

Frias
quelle

Antworten:

323

verwenden str

try:
    some_method()
except Exception as e:
    s = str(e)

Außerdem haben die meisten Ausnahmeklassen ein argsAttribut. Oft args[0]wird eine Fehlermeldung angezeigt.

Es sollte beachtet werden, dass nur using streine leere Zeichenfolge reprzurü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?

aaronasterling
quelle
Ich drucke dies aus, um einen Bericht zu erstellen. Die str (e) ist in Ordnung, denke ich. Vielen Dank
Frias
8
Ich würde es vorziehen, zu verwenden, e.messageda es sich args[0]möglicherweise nicht um eine Nachricht handelt.
Cedbeu
3
repr (e) ist auch hilfreich, wenn Sie die vollständige Ausnahme erhalten möchten (z. B. NameError ("globaler Name 'Variable' ist nicht definiert"), anstelle von "globaler Name 'Variable' ist nicht definiert"
Ben Morris
49
Diese Antwort ist gefährlich, da sie bei Unicode-Ausnahmen wie diesen fehlschlägt : 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).
Jörn Hees
11
Stimmen Sie mit @ JörnHees überein. Ich kann nicht zählen, wie oft str(oder sogar unicodeoder .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.
Kenny Trytek
185

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
pyfunc
quelle
2
ah, reprist nützlich, danke, es scheint alles andere unicode, strCodierung, ... kann je nach Eingabe eine Ausnahme auslösen. Nicht ganz nützlich, wenn man versucht, die Ausnahme exception-safe
beizubehalten
2
Dies ist viel besser als alle 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".
jlh
27

Obwohl mir klar ist, dass dies eine alte Frage ist, möchte ich vorschlagen, das tracebackModul 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.

Blckknght
quelle
23

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 uUnicode 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.argsund str(e)je nach Bedarf (und möglicherweise , e.messagewenn die lib Sie auf diesen Mechanismus verwenden , setzt).

Zum Beispiel mit pygraphviz, e.messageist der einzige Weg , richtig die Ausnahme angezeigt werden , indem str(e)umgeben wird die Nachricht mit u''.

Aber mit MySQLdbder richtigen Art und Weise die Nachricht abzurufen ist e.args[1]: e.messageleer ist , und str(e)wird angezeigt'(ERR_CODE, "ERR_MSG")'

Cedbeu
quelle
0

Für Python2 ist es besser e.message, die Ausnahmemeldung abzurufen. Dies wird vermieden UnicodeDecodeError. Aber ja e.messagewird für einige Ausnahmen wie leer sein. OSErrorIn diesem Fall können wir exc_info=Trueunserer Protokollierungsfunktion eine hinzufügen , um den Fehler nicht zu verpassen.
Für Python3 halte ich es für sicher str(e).

apporc
quelle
0

Wenn Sie den Typ / Ursprung des Fehlers nicht kennen, können Sie Folgendes versuchen:

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

Beachten Sie jedoch, dass Sie eine pep8-Warnung erhalten:

[W] PEP 8 (E722): do not use bare except
Kostanos
quelle
0

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}
DanGoodrick
quelle