Skip to content

Kapitel 14: Ausnahmebehandlung (Exception Handling)

🎯 Lernziele

In diesem Kapitel lernst du:

  • Was Ausnahmen (Exceptions) sind
  • try-except-Blöcke zu verwenden
  • Verschiedene Arten von Ausnahmen zu behandeln
  • finally- und else-Blöcke zu verwenden
  • Eigene Ausnahmen zu definieren

14.1 Was sind Ausnahmen (Exceptions)?

🤔 Was passiert bei Fehlern?

Ohne Fehlerbehandlung:

python
alter = int(input("Wie alt bist du? "))
print(f"Du bist {alter} Jahre alt.")

# Wenn Benutzer "zwanzig" eingibt → ValueError!
# Programm stürzt ab!

Mit Fehlerbehandlung:

python
try:
    alter = int(input("Wie alt bist du? "))
    print(f"Du bist {alter} Jahre alt.")
except ValueError:
    print("Bitte gib eine gültige Zahl ein!")

# Programm läuft weiter!
print("Danke für deine Eingabe.")

🎁 Vorteile der Fehlerbehandlung

  • Programm stürzt nicht ab: Fehler werden elegant abgefangen
  • Bessere Benutzererfahrung: Fehlermeldungen sind benutzerfreundlich
  • Debugging erleichtern: Fehler werden protokolliert

14.2 Grundlegende Syntax (try-except)

📏 Grundlegende Syntax

python
try:
    # Code, der einen Fehler verursachen könnte
    gefährlicher_code
except Ausnahmetyp:
    # Code, der ausgeführt wird, wenn ein Fehler auftritt
    fehlerbehandlung

💡 Einfaches Beispiel

python
try:
    zahl = int(input("Gib eine Zahl ein: "))
    ergebnis = 100 / zahl
    print(f"Ergebnis: {ergebnis}")
except ZeroDivisionError:
    print("Fehler: Division durch Null!")
except ValueError:
    print("Fehler: Bitte gib eine gültige Zahl ein!")

print("Programm beendet.")  # Wird immer ausgeführt

14.3 Verschiedene Ausnahmetypen

🔍 Häufige Ausnahmetypen

AusnahmetypBedeutung
ValueErrorUngültiger Wert (z.B. int("abc"))
TypeErrorFalscher Datentyp
ZeroDivisionErrorDivision durch Null
IndexErrorIndex außerhalb des Bereichs
KeyErrorSchlüssel nicht gefunden (Dictionary)
FileNotFoundErrorDatei nicht gefunden
ImportErrorModul kann nicht importiert werden

💡 Beispiele

1. ValueError:

python
try:
    zahl = int("abc")  # ValueError!
except ValueError:
    print("Das ist keine gültige Zahl!")

2. IndexError:

python
try:
    list = [1, 2, 3]
    print(list[5])  # IndexError!
except IndexError:
    print("Index außerhalb des Bereichs!")

3. KeyError:

python
try:
    dict = {"a": 1}
    print(dict["b"])  # KeyError!
except KeyError:
    print("Schlüssel nicht gefunden!")

4. FileNotFoundError:

python
try:
    file = open("nicht_existiert.txt", "r")
except FileNotFoundError:
    print("Datei nicht gefunden!")

14.4 Mehrere except-Blöcke

🔗 Verschiedene Fehler unterschiedlich behandeln

python
try:
    zahl = int(input("Gib eine Zahl ein: "))
    ergebnis = 100 / zahl
    print(f"Ergebnis: {ergebnis}")
except ValueError:
    print("Fehler: Keine gültige Zahl!")
except ZeroDivisionError:
    print("Fehler: Division durch Null!")
except Exception as e:
    print(f"Anderer Fehler aufgetreten: {e}")

💡 Exception (Alle Fehler abfangen)

python
try:
    # Gefährlicher Code
    pass
except Exception as e:
    print(f"Ein Fehler ist aufgetreten: {e}")

14.5 else- und finally-Blöcke

➕ else-Block (Wenn KEIN Fehler auftritt)

python
try:
    zahl = int(input("Gib eine Zahl ein: "))
    ergebnis = 100 / zahl
except ValueError:
    print("Fehler: Keine gültige Zahl!")
except ZeroDivisionError:
    print("Fehler: Division durch Null!")
else:
    # Wird NUR ausgeführt, wenn KEIN Fehler auftritt
    print(f"Ergebnis: {ergebnis}")

🔒 finally-Block (Immer ausführen)

python
try:
    file = open("test.txt", "r")
    inhalt = file.read()
    print(inhalt)
except FileNotFoundError:
    print("Datei nicht gefunden!")
finally:
    # Wird IMMER ausgeführt (auch bei Fehlern)
    file.close()  # Datei sicher schließen
    print("Datei geschlossen.")

💡 Praxisbeispiel: Dateioperationen

python
file = None
try:
    file = open("test.txt", "r", encoding="utf-8")
    inhalt = file.read()
    print(inhalt)
except FileNotFoundError:
    print("Datei nicht gefunden!")
finally:
    if file:
        file.close()
        print("Datei geschlossen.")

14.6 Eigene Ausnahmen definieren

🏗️ Eigene Ausnahme-Klasse

python
# Eigene Ausnahme definieren
class MeinFehler(Exception):
    pass

# Ausnahme auslösen
def überprüfe_alter(alter):
    if alter < 0:
        raise MeinFehler("Alter kann nicht negativ sein!")
    elif alter > 150:
        raise MeinFehler("Alter ist unrealistisch!")
    else:
        print(f"Alter: {alter}")

# Verwenden
try:
    überprüfe_alter(-5)
except MeinFehler as e:
    print(f"Fehler: {e}")

💡 raise-Anweisung (Ausnahme auslösen)

python
def teilen(a, b):
    if b == 0:
        raise ZeroDivisionError("Division durch Null ist nicht erlaubt!")
    return a / b

try:
    ergebnis = teilen(10, 0)
except ZeroDivisionError as e:
    print(f"Fehler: {e}")

14.7 Best Practices

✅ Dos:

  • Spezifische Ausnahmen zuerst, allgemeine später
  • Nur den fehleranfälligen Code in try-Block
  • ✅ ** finally für Aufräumarbeiten** verwenden
  • Eigene Ausnahmen für spezifische Fehler definieren

❌ Don'ts:

  • Zu breite try-Blöcke (schwer zu debuggen)
  • except Exception ohne spezifische Behandlung (verschleiert Fehler)
  • Leere except-Blöcke (Fehler werden ignoriert)

💡 Beispiel für schlechten Code:

python
# Schlecht
try:
    # 50 Zeilen Code
    pass
except Exception:
    pass  # Fehler werden ignoriert!

# Besser
try:
    zahl = int(input("Zahl: "))
except ValueError:
    print("Ungültige Eingabe!")

📝 Zusammenfassung

In diesem Kapitel hast du gelernt:

  • ✅ Was Ausnahmen (Exceptions) sind
  • ✅ try-except-Blöcke zu verwenden
  • ✅ Verschiedene Ausnahmetypen zu behandeln (ValueError, IndexError, etc.)
  • ✅ else- und finally-Blöcke zu verwenden
  • ✅ Eigene Ausnahmen zu definieren
  • ✅ Best Practices für Fehlerbehandlung

🎯 Übung

  1. Schreibe ein Programm, das den Benutzer nach einer Zahl fragt und den Kehrwert bildet (1/x). Behandle mögliche Fehler.
  2. Erstelle ein Programm, das eine Datei liest. Behandle den Fall, dass die Datei nicht existiert.
  3. Definiere eine eigene Ausnahme UngültigesPasswort, die ausgelöst wird, wenn ein Passwort zu kurz ist.

⏭️ Nächstes Kapitel

In Kapitel 15 lernen wir Objektorientierte Programmierung (OOP) - Klassen und Objekte!

Frei für alle Anfänger