HOWTO · Python

Eine Exception in Python ausgeben

Erfahren Sie, wie Sie eine Exception in Python ausgeben, zwischen Nachricht und vollständigem Traceback wählen und typische Fehler vermeiden.

Auf dieser Seite

Verwenden Sie print(exception), wenn nur die Fehlermeldung benötigt wird. Verwenden Sie traceback.print_exc() innerhalb eines aktiven except-Blocks, wenn der vollständige Traceback mit Datei und fehlerhafter Zeile benötigt wird. Behandeln Sie konkrete Exception-Typen und verwenden Sie für dauerhaft benötigte Diagnosen statt print() das Logging.

Die Exception-Nachricht ausgeben

Fangen Sie die Exception in einer Variablen auf und übergeben Sie sie an print(). So sehen Sie am schnellsten, was schiefgelaufen ist:

try:
    result = 10 / 0
except ZeroDivisionError as exc:
    print("Could not calculate result:", exc)

Ausgabe:

Could not calculate result: division by zero

Das Exception-Objekt wird in seinen Nachrichtentext umgewandelt. Dieses Beispiel fängt gezielt ZeroDivisionError ab, sodass ein unabhängiger Programmierfehler weniger leicht verborgen wird. Wenn mehrere Fehler gleich behandelt werden sollen, listen Sie ihre Typen in einem Tupel auf, zum Beispiel except (TypeError, ValueError) as exc:.

Den vollständigen Traceback ausgeben

Die Nachricht zeigt möglicherweise nicht, wo der Fehler entstanden ist. Importieren Sie das integrierte Python-Modul traceback und rufen Sie print_exc() auf, solange der Handler aktiv ist:

import traceback

try:
    values = [1, 2]
    value = values[3]
except IndexError:
    traceback.print_exc()

Die Ausgabe enthält den Exception-Typ, die Nachricht, die Datei und die fehlgeschlagene Zeile. Ein Traceback ist hilfreicher als eine Nachricht, wenn die Exception aus mehreren verschachtelten Funktionsaufrufen stammt.

print_exc() liest die gerade behandelte Exception. Wird die Funktion nach dem Ende des except-Blocks oder ohne aktive Exception aufgerufen, stellt sie keinen früheren Traceback wieder her; sie kann NoneType: None ausgeben. Lassen Sie den Aufruf im Handler oder speichern Sie die Exception und verwenden Sie für explizite Kontrolle print_exception().

Die Traceback-Formatierung ausdrücklich steuern

traceback.print_exception() akzeptiert ein Exception-Objekt und kann in einen ausgewählten Stream schreiben. Das ist nützlich, wenn die Exception formatiert oder umgeleitet werden muss:

import sys
import traceback

try:
    int("not a number")
except ValueError as exc:
    traceback.print_exception(exc, file=sys.stdout)

Um Text zu erzeugen, anstatt sofort zu drucken, verwenden Sie traceback.format_exception(exc):

import traceback

try:
    raise RuntimeError("configuration is missing")
except RuntimeError as exc:
    formatted = "".join(traceback.format_exception(exc))
    print(formatted)

Die traceback-Funktionen erhalten standardmäßig die Verkettung von Exceptions. Eine Kette mit raise ... from ... kann daher sowohl die ursprüngliche als auch die neue Exception zeigen. Begrenzen Sie den Traceback oder deaktivieren Sie die Verkettung nur, wenn es der Ausgabe-Vertrag verlangt; das Entfernen des Kontexts erschwert die Diagnose.

Eigene Exceptions und Logging

Definieren Sie eine eigene Exception, wenn Aufrufer einen fachlichen Fehler von einem integrierten Fehler unterscheiden müssen. Fangen Sie diesen Typ ab und geben Sie seine Nachricht auf dieselbe Weise aus:

class ConfigurationError(Exception):
    pass

try:
    raise ConfigurationError("API key is missing")
except ConfigurationError as exc:
    print("Configuration failed:", exc)

In einer Anwendung oder einem Dienst ist logging.exception() innerhalb des Handlers vorzuziehen. Es zeichnet Nachricht und aktiven Traceback auf, und Logging-Handler können die Daten in eine Datei oder an eine Überwachung weiterleiten:

import logging

try:
    load_settings()
except Exception:
    logging.exception("Loading settings failed")

Ersetzen Sie load_settings() durch die fehleranfällige Operation. Das Beispiel verwendet eine breite Exception-Abfrage absichtlich an einer Logging-Grenze; normale Programmlogik sollte die konkreten Exception-Typen fangen, die sie tatsächlich behandeln kann.

Häufige Fehler und FAQ

  • Ein nacktes except: fängt auch KeyboardInterrupt und SystemExit. Vermeiden Sie es, außer Sie müssen bestimmte Unterklassen von BaseException behandeln.
  • Geben Sie nicht nur eine allgemeine Nachricht aus und laufen Sie dann still weiter, wenn das Programm kein gültiges Ergebnis erzeugen kann. Werfen Sie die Exception erneut oder geben Sie einen ausdrücklichen Fehler zurück.
  • type(exc) zeigt die konkrete Klasse, str(exc) die lesbare Nachricht. repr(exc) kann eine diagnostisch ausführlichere Darstellung liefern.
  • Für Protokolle verwenden Sie logging.exception() innerhalb des Handlers. Für eine kurze interaktive Diagnose genügt print(exc).
  • traceback.print_exc() gilt für die gerade behandelte Exception; traceback.print_exception(exc) ist klarer, wenn Sie ein Exception-Objekt behalten und Formatierung oder Ausgabe steuern müssen.

Diese Muster verwenden Pythons integrierten Exception-Mechanismus und benötigen kein Paket eines Drittanbieters. Die richtige Wahl hängt davon ab, ob eine Nachricht, der vollständige Aufrufpfad, formatierter Text oder ein dauerhaftes Anwendungsprotokoll benötigt wird.