Antworten:
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)
str( KeyError('bad'))
=> 'bad'
- sagt nicht Ausnahmetyp
print(repr(e))
. Die Exception.__str__
Basisimplementierung gibt nur die Ausnahmemeldung zurück, nicht den Typ. Oder verwenden Sie das traceback
Modul, das Methoden zum Drucken der aktuellen Ausnahme, formatiert oder des vollständigen Tracebacks enthält.
Das traceback
Modul 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
error_message = traceback.format_exc()
except Exception as ex:
...
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.
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
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
(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.stdout
standardmäß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 sys
damit dies funktioniert.) Auf diese Weise wird der Fehler STDERR
anstelle 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 traceback
Modul 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.
logging
Anstatt die Grundfunktion zu print()
verwenden, kann das flexiblere logging
Modul zum Protokollieren der Ausnahme verwendet werden. Das logging
Modul 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 logging
Modul sollte nicht in einem Protokollierungshandler verwendet werden, um ein RecursionError
(danke @PrakharPandey) zu vermeiden.
Es ist auch möglich, die Ausnahme mit einer anderen Protokollebene zu protokollieren, indem Sie das Schlüsselwortargument exc_info=True
wie 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)
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'
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'
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'