1412 Stimmen

Wie druckt man eine Ausnahme in Python?

try:
    something here
except:
    print('the whatever error occurred.')

Wie kann ich den Fehler/die Ausnahme in meinem except: blockieren?

1918voto

jldupont Punkte 87330

Für Python 2.6 und höher und Python 3.x:

except Exception as e: print(e)

Für Python 2.5 und früher, verwenden Sie:

except Exception,e: print str(e)

790voto

Cat Plus Plus Punkte 119072

El traceback Modul bietet Methoden für Formatierungs- und Druckausnahmen und ihre Rückverfolgungen, z.B. würde dies eine Ausnahme ausgeben, wie es der Standard-Handler tut:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

Output:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

201voto

ilya n. Punkte 17572

Unter Python 2.6 oder höher es ist ein bisschen sauberer:

except Exception as e: print(e)

In älteren Versionen ist sie noch recht gut lesbar:

except Exception, e: print e

132voto

winklerrr Punkte 9251

Python 3: logging

Anstelle der Verwendung der grundlegenden print() Funktion, die flexiblere logging Modul kann zur Protokollierung der Ausnahme verwendet werden. Das logging Modul bietet eine Menge zusätzlicher Funktionen, z.B. die Protokollierung von Meldungen in eine bestimmte Protokolldatei, die Protokollierung von Meldungen mit Zeitstempeln und zusätzlichen Informationen darüber, wo die Protokollierung stattgefunden hat. (Für weitere Informationen besuchen Sie die offizielle Dokumentation .)

Die Protokollierung einer Ausnahme kann mit der Funktion auf Modulebene logging.exception() etwa so:

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

Output:

ERROR:root:An exception was thrown!
Traceback (most recent call last):
  File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

Anmerkungen:

  • die Funktion logging.exception() sollte nur von einem Exception-Handler aufgerufen werden

  • die logging Modul sollte nicht innerhalb eines Logging-Handlers verwendet werden, um eine RecursionError (dank @PrakharPandey)


Alternative Log-Levels

Es ist auch möglich, die Ausnahme mit einem anderen Log-Level zu protokollieren, indem man das Schlüsselwort-Argument exc_info=True etwa so:

logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)

76voto

grish Punkte 861

(Ich wollte dies eigentlich als Kommentar zu @jlduponts Antwort hinterlassen, aber ich habe nicht genug Ansehen).

Ich habe Antworten wie die von @jldupont auch an anderen Stellen gesehen. FWIW, Ich denke, es ist wichtig zu beachten, dass dies:

except Exception as e:
    print(e)

gibt die Fehlerausgabe an sys.stdout standardmäßig. Ein besserer Ansatz für die Fehlerbehandlung im Allgemeinen wäre:

except Exception as e:
    print(e, file=sys.stderr)

(Beachten Sie, dass Sie import sys damit dies funktioniert.) Auf diese Weise wird der Fehler gedruckt in STDERR anstelle von STDOUT , die eine ordnungsgemäße Analyse/Umleitung der Ausgabe usw. ermöglicht. Ich verstehe, dass sich die Frage ausschließlich auf das "Drucken eines Fehlers" bezog, aber es scheint wichtig zu sein, hier auf die beste Praxis hinzuweisen, anstatt dieses Detail wegzulassen, das zu nicht standardmäßigem Code für jeden führen könnte, der es nicht irgendwann besser lernt.

Ich habe nicht die traceback Modul wie in der Antwort von Cat Plus Plus, und vielleicht ist das auch der beste Weg, aber ich dachte, ich werfe das hier mal raus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X