wake-up-neo.com

Den Ausnahmewert in Python abrufen

Wenn ich diesen Code habe:

try:
    some_method()
except Exception,e:

Wie kann ich diesen Ausnahmewert erhalten (Zeichenfolge Darstellung)?

Vielen Dank

189
Frias

verwenden Sie str

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

Die meisten Ausnahmeklassen verfügen außerdem über ein args-Attribut. Oft ist args[0] eine Fehlermeldung.

Es sei darauf hingewiesen, dass die Verwendung von str eine leere Zeichenfolge zurückgibt, wenn keine Fehlermeldung angezeigt wird, während bei Verwendung von repr als Empfehlung von pyfunc mindestens die Klasse der Ausnahme angezeigt wird. Meine Meinung ist, wenn Sie es ausdrucken, ist es für einen Endbenutzer, der sich nicht für die Klasse interessiert und nur eine Fehlermeldung wünscht.

Es hängt wirklich von der Klasse der Ausnahme ab, mit der Sie es zu tun haben und wie sie instanziiert wird. Hatten Sie etwas Besonderes im Sinn?

252
aaronasterling

Verwenden Sie repr () und Der Unterschied zwischen repr und str

Mit repr:

>>> try:
...     print x
... except Exception, e:
...     print repr(e)
... 
NameError("name 'x' is not defined",)
>>> 

Mit str:

>>> 
>>> try:
...     print x
... except Exception, e:
...     print str(e)
... 
name 'x' is not defined
>>> 
>>> 
149
pyfunc

Auch wenn mir klar ist, dass dies eine alte Frage ist, möchte ich vorschlagen, das Modul traceback zu verwenden, um die Ausgabe der Ausnahmen zu behandeln.

Verwenden Sie traceback.print_exc(), um die aktuelle Ausnahme zum Standardfehler zu drucken, genauso wie es gedruckt würde, wenn sie nicht erfasst wurde, oder traceback.format_exc(), um dieselbe Ausgabe als Zeichenfolge zu erhalten. Sie können einer dieser Funktionen verschiedene Argumente übergeben, wenn Sie die Ausgabe einschränken oder den Druck auf ein dateiähnliches Objekt umleiten möchten.

23
Blckknght

Ein anderer Weg ist noch nicht gegeben:

try:
    1/0
except Exception, e:
    print e.message

Ausgabe:

integer division or modulo by zero

args[0] ist möglicherweise keine Nachricht.

str(e) gibt möglicherweise die Zeichenfolge mit umgebenden Anführungszeichen und möglicherweise mit der führenden u zurück, wenn Unicode verwendet wird:

'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',)"

edit

Mein Fehler !!! Es scheint, dass BaseException.messagevon 2.6 abgelehnt wurde. Schließlich scheint es definitiv keine standardisierte Methode für die Anzeige von Ausnahmemeldungen zu geben. Ich denke, das Beste ist, sich mit e.args und str(e) zu beschäftigen, abhängig von Ihren Bedürfnissen (und möglicherweise e.message, wenn die von Ihnen verwendete Bibliothek auf diesen Mechanismus angewiesen ist).

Mit pygraphviz ist e.message beispielsweise die einzige Möglichkeit, die Ausnahme richtig anzuzeigen. Mit str(e) wird die Nachricht mit u'' umgeben.

Bei MySQLdb ist der richtige Weg zum Abrufen der Nachricht jedoch e.args[1]: e.message ist leer und str(e) zeigt '(ERR_CODE, "ERR_MSG")' an.

23
cedbeu

Für python2 ist es besser, e.message zu verwenden, um die Ausnahmemeldung abzurufen. Dies vermeidet mögliche UnicodeDecodeError. Ja, aber e.message ist für einige Ausnahmen wie OSError leer. In diesem Fall können wir unserer Protokollierungsfunktion einen exc_info=True hinzufügen, um den Fehler nicht zu übersehen.
Für Python3 denke ich, dass es sicher ist, str(e) zu verwenden.

0
apporc

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]))

Aber seien Sie sich bewusst, Sie erhalten eine pep8-Warnung:

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