Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

Fehler sind in jedem Programm unvermeidlich, und Python bietet verschiedene Möglichkeiten, mit ihnen umzugehen.
Fehlerbehandlung ist entscheidend, um sicherzustellen, dass Ihr Programm auch dann sicher und effizient weiterlaufen kann, wenn etwas Unerwartetes passiert.

In dieser Lektion betrachten wir die verschiedenen Arten von Fehlern, wie man sie behandelt, wie man eigene Fehler auslöst und wie man sicherstellt, dass wichtige Aufräumarbeiten immer ausgeführt werden.


Fehlerarten in Python

Bevor wir lernen, wie man Fehler behandelt, müssen wir die beiden Hauptkategorien verstehen:

  • Syntaxfehler: Diese treten auf, wenn der Python-Code syntaktisch nicht korrekt ist. Sie werden vom Python-Interpreter erkannt, bevor das Programm läuft.
    Beispiel: Ein vergessenes Doppelpunkt nach einer if-Anweisung.

  • Ausnahmen (Exceptions): Diese treten während das Programm läuft auf, wenn etwas Unerwartetes geschieht – zum Beispiel eine Division durch Null oder der Versuch, auf einen ungültigen Index einer Liste zuzugreifen.

Behandlung von Ausnahmen mit try und except

Die gebräuchlichste Methode, Ausnahmen in Python zu behandeln, ist die Verwendung von try/except-Blöcken:

  • Der try-Block enthält den Code, der eine Ausnahme auslösen könnte.
  • Der except-Block enthält den Code, der ausgeführt wird, falls eine Ausnahme auftritt.

Beispiel:

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
except IOError:
    print("Die Datei konnte nicht geöffnet werden.")

Hier:

  • Wenn "file.txt" nicht existiert oder nicht geöffnet werden kann, löst Python einen IOError aus.
  • Der except-Block fängt diesen ab und gibt eine freundliche Meldung aus, anstatt abzustürzen.
TIPP: Halten Sie den try-Block so klein wie möglich – schließen Sie nur den Code ein, der fehlschlagen kann, nicht den gesamten restlichen Code.

Behandlung mehrerer Ausnahmetypen

Sie können verschiedene Ausnahmetypen getrennt behandeln, indem Sie mehrere except-Blöcke verwenden:

try:
    # Code, der Ausnahmen auslösen kann
except TypeError:
    # Behandlung von Typfehlern
except ValueError:
    # Behandlung von Wertefehlern
except:
    # Behandlung aller anderen Ausnahmen

Der letzte nackte except fängt jede unbehandelte Ausnahme ab – verwenden Sie ihn jedoch mit Vorsicht, da er unerwartete Fehler verbergen kann.

Eigene Ausnahmen auslösen

Manchmal muss Ihr Programm signalisieren, dass etwas schiefgelaufen ist – selbst wenn Python das normalerweise nicht als Fehler ansehen würde. Sie können Ausnahmen mit der Anweisung raise auslösen.

Beispiel:

def divide(a, b):
    if b == 0:
        raise ValueError("Das zweite Argument darf nicht null sein")
    return a / b

print(divide(10, 2))  # 5.0
print(divide(10, 0))  # ValueError: Das zweite Argument darf nicht null sein

Damit können Sie klare Fehlermeldungen definieren und die Ausführung stoppen, wenn ungültige Daten vorliegen.

Der finally-Block

Der finally-Block enthält Code, der immer ausgeführt wird – unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht. Er wird oft zum Freigeben von Ressourcen wie Dateien oder Datenbankverbindungen verwendet.

Beispiel:

try:
    file = open("file.txt", "r")
    content = file.read()
    print(content)
finally:
    file.close()

Selbst wenn das Lesen der Datei einen Fehler verursacht, sorgt der finally-Block dafür, dass die Datei geschlossen wird.

WICHTIG: Schließen Sie Dateien und geben Sie Ressourcen immer in einem finally-Block frei (oder verwenden Sie die "with"-Anweisung), um Lecks zu vermeiden.


Verstanden – hier ist ein zusätzlicher Abschnitt, den Sie an die Fehlerbehandlung-Lektion anhängen können, der erklärt, warum „try/except alles“ eine schlechte Praxis ist und wann gezielte Fehlerbehandlung sinnvoll ist.


Vermeiden Sie es, jede Ausnahme ohne Grund abzufangen

Ein häufiger Anfängerfehler ist es, große Codeteile in einem einzigen try/except-Block zusammenzufassen, der alles abfängt – oder schlimmer noch, einfach except: ohne Angabe des Fehlertyps zu verwenden.

Beispiel für schlechte Praxis:

try:
    # viel zusammenhangloser Code
except:
    pass  # ignoriert alle Fehler stillschweigend

Warum das gefährlich ist:

  • Versteckt Fehler: Echte Fehler im Code werden ignoriert, was das Finden erschwert.
  • Verliert die Fehlerursache: Man verliert Informationen darüber, was genau schiefgelaufen ist.
  • Kann unerwartetes Verhalten verursachen: Das Programm läuft in einem ungültigen Zustand weiter.

Wann breit gefasste Fehlerbehandlung sinnvoll ist

Das Abfangen aller Ausnahmen (except Exception:) sollte selten und bewusst erfolgen. Beispiele, wann es angebracht sein könnte:

  • Fehlerprotokollierung auf oberster Ebene in einem Programm, um Abstürze zu verhindern und Fehler in eine Logdatei zu schreiben.
  • Fail-Safe-Schleifen in Diensten, die dauerhaft laufen müssen (aber den Fehler vor dem Weitermachen protokollieren/melden).
  • Vorübergehende Debugging-Maßnahmen, um schnell zu überprüfen, ob irgendetwas schiefgeht – aber nur als kurzfristiges Werkzeug.

Beste Praxis

  • Seien Sie spezifisch: Fangen Sie nur die Ausnahmen ab, die Sie erwarten und behandeln können.
  • Halten Sie try-Blöcke klein: Umfassen Sie nur den Code, der fehlschlagen kann, nicht ganze Funktionen.
  • Protokollieren oder behandeln Sie Ausnahmen sinnvoll – ignorieren Sie sie nicht einfach mit „pass“.

Mit gezielter Fehlerbehandlung wird Ihr Code leichter zu debuggen, sicherer zu verwenden und viel vorhersehbarer.


Zusammenfassung

Fehlerbehandlung ist ein fundamentaler Teil der Python-Programmierung:

  • Sie verhindert unerwartete Abstürze.
  • Sie ermöglicht es, Probleme elegant zu lösen.
  • Sie macht Ihren Code robuster, zuverlässiger und sicherer.

Wenn Sie Ausnahmen meistern, eigene Fehler auslösen und finally verwenden, schreiben Sie Programme, die besser auf die reale Welt vorbereitet sind.