Appearance
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ührt14.3 Verschiedene Ausnahmetypen
🔍 Häufige Ausnahmetypen
| Ausnahmetyp | Bedeutung |
|---|---|
ValueError | Ungültiger Wert (z.B. int("abc")) |
TypeError | Falscher Datentyp |
ZeroDivisionError | Division durch Null |
IndexError | Index außerhalb des Bereichs |
KeyError | Schlüssel nicht gefunden (Dictionary) |
FileNotFoundError | Datei nicht gefunden |
ImportError | Modul 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 Exceptionohne 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
- Schreibe ein Programm, das den Benutzer nach einer Zahl fragt und den Kehrwert bildet (1/x). Behandle mögliche Fehler.
- Erstelle ein Programm, das eine Datei liest. Behandle den Fall, dass die Datei nicht existiert.
- 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!
