Wie drucke ich eine Ausnahme in Python?

Antworten:

1062

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

except Exception as e: print(e)

Verwenden Sie für Python 2.5 und frühere Versionen:

except Exception,e: print str(e)
jldupont
quelle
41
str( KeyError('bad'))=> 'bad'- sagt nicht Ausnahmetyp
Dave
10
print (e) on keyerrors scheint nur den Schlüssel zu geben, aber nicht die vollständige Ausnahmemeldung, was weniger hilfreich ist.
Veggiet
14
Wenn Sie die Ausnahme drucken möchten, ist es besser, sie zu verwenden print(repr(e)). Die Exception.__str__Basisimplementierung gibt nur die Ausnahmemeldung zurück, nicht den Typ. Oder verwenden Sie das tracebackModul, das Methoden zum Drucken der aktuellen Ausnahme, formatiert oder des vollständigen Tracebacks enthält.
Martijn Pieters
452

Das tracebackModul bietet Methoden zum Formatieren und Drucken von Ausnahmen und deren Rückverfolgungen, z. B. würde dies Ausnahmen drucken, wie dies der Standardhandler tut:

import traceback

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

Ausgabe:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero
Cat Plus Plus
quelle
3
Gibt es eine Art get_error_message-Aufruf, den ich drucken kann, da ich meine eigene Druckroutine verwende, um einige andere Dinge hinzuzufügen?
MikeSchem
10
@ MikeSchem error_message = traceback.format_exc()
heyzling
3
Danke, das ist das, was ich wollte. Ganze Spur, nicht nur der Fehlertyp und die Meldung
Ken Bellows
Bei diesem Ausschnitt wird das erfasste Ausnahmeobjekt nicht verwendet. Können Sie den Code erweitern, um 'ex' zu verwenden? - wie in except Exception as ex:...
Aaronsteers
@aaronsteers verwendet die erfasste Ausnahme; In einem Ausnahmebehandler ist die aktuelle Ausnahme über die sys.exc_info()Funktion verfügbar und traceback.print_exc()wird von dort abgerufen . Sie müssen eine Ausnahme immer nur explizit übergeben, wenn Sie eine Ausnahme nicht behandeln oder wenn Sie Informationen basierend auf einer anderen Ausnahme anzeigen möchten.
Martijn Pieters
169

In Python 2.6 oder höher ist es etwas sauberer:

except Exception as e: print(e)

In älteren Versionen ist es immer noch gut lesbar:

except Exception, e: print e
ilya n.
quelle
15
In Python3 muss der 1. Weg mit "as" verwendet werden.
Sam Watkins
53

Falls Sie Fehlerzeichenfolgen übergeben möchten, finden Sie hier ein Beispiel aus Fehlern und Ausnahmen (Python 2.6).

>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
Nick Dandoulakis
quelle
38

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

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

except Exception as e:
    print(e)

druckt die Fehlerausgabe sys.stdoutstandardmäßig an. Ein geeigneterer Ansatz zur Fehlerbehandlung im Allgemeinen wäre:

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

(Beachten Sie, dass dies erforderlich ist, import sysdamit dies funktioniert.) Auf diese Weise wird der Fehler STDERRanstelle von gedruckt STDOUT, wodurch die ordnungsgemäße Analyse / Umleitung / usw. der Ausgabe ermöglicht wird. Ich verstehe, dass es bei der Frage ausschließlich um das Drucken eines Fehlers ging, aber es scheint wichtig, hier auf die bewährte Methode hinzuweisen, anstatt dieses Detail wegzulassen, das zu nicht standardmäßigem Code für alle führen könnte, die letztendlich nicht besser lernen.

Ich habe das tracebackModul nicht wie in der Antwort von Cat Plus Plus verwendet, und vielleicht ist das der beste Weg, aber ich dachte, ich würde es da rauswerfen.

grish
quelle
1
Ich würde vorschlagen, weiter Flush = True hinzuzufügen. Ich habe festgestellt, dass mit systemd (und ohne Verwendung eines geeigneten Protokollierungsframeworks) das Puffern beim Erfassen im Journal nicht das ist, was ich erwartet hätte.
Cameron Kerr
20

Python 3: logging

Anstatt die Grundfunktion zu print()verwenden, kann das flexiblere loggingModul zum Protokollieren der Ausnahme verwendet werden. Das loggingModul bietet viele zusätzliche Funktionen, z. B. das Protokollieren von Nachrichten in einer bestimmten Protokolldatei, das Protokollieren von Nachrichten mit Zeitstempeln und zusätzliche Informationen darüber, wo die Protokollierung stattgefunden hat. (Weitere Informationen finden Sie in der offiziellen Dokumentation .)

Das Protokollieren einer Ausnahme kann mit der Funktion auf Modulebene logging.exception()wie folgt erfolgen:

import logging

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

Ausgabe:

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 Ausnahmebehandler aufgerufen werden

  • Das loggingModul sollte nicht in einem Protokollierungshandler verwendet werden, um ein RecursionError(danke @PrakharPandey) zu vermeiden.


Alternative Protokollebenen

Es ist auch möglich, die Ausnahme mit einer anderen Protokollebene zu protokollieren, indem Sie das Schlüsselwortargument exc_info=Truewie folgt verwenden:

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)
winklerrr
quelle
1
Sollte nicht in einem Protokollierungshandler verwendet werden, um RecursionError
Prakhar Pandey
4

Ein Liner-Fehler kann mit Assert-Anweisungen ausgelöst werden, wenn Sie dies möchten. Auf diese Weise können Sie statisch reparierbaren Code schreiben und Fehler frühzeitig überprüfen.

assert type(A) is type(""), "requires a string"
Whatnick
quelle
2

Man hat so ziemlich die Kontrolle darüber, welche Informationen aus dem Traceback angezeigt / protokolliert werden sollen, wenn Ausnahmen abgefangen werden.

Der Code

with open("not_existing_file.txt", 'r') as text:
    pass

würde den folgenden Traceback erzeugen:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Drucken / Protokollieren Sie den vollständigen Traceback

Wie bereits erwähnt, können Sie den gesamten Traceback mithilfe des Traceback-Moduls abfangen:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

Dies erzeugt die folgende Ausgabe:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Sie können dasselbe erreichen, indem Sie die Protokollierung verwenden:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

Ausgabe:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Nur Druckername / Nachricht drucken / protokollieren

Möglicherweise interessieren Sie sich nicht für den gesamten Traceback, sondern nur für die wichtigsten Informationen, wie z. B. den Namen der Ausnahme und die Ausnahme-Nachricht. Verwenden Sie:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

Ausgabe:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'
Gin Tonic
quelle