Fehlerbehandlung mit try/except in Python
Fehler sind beim Programmieren normal. Lerne, wie du mit try/except dein Python-Programm robust machst und Abstürze elegant abfängst.
Egal wie sorgfältig du programmierst – früher oder später passieren Fehler. Eine Datei fehlt, der Benutzer gibt Buchstaben statt Zahlen ein, oder eine Internetverbindung bricht ab. Ohne Vorkehrungen stürzt dein Programm in solchen Momenten einfach ab. In Python kannst du solche Situationen mit try/except abfangen und gezielt darauf reagieren. In diesem Beitrag lernst du, wie du Ausnahmen (Exceptions) behandelst und deine Programme robust und benutzerfreundlich machst.
Warum Programme abstürzen
Wenn in Python etwas Unerwartetes passiert, wird eine Exception ausgelöst. Wird sie nicht behandelt, bricht das Programm mit einer Fehlermeldung ab. Ein klassisches Beispiel ist die Division durch null:
zahl = 10
ergebnis = zahl / 0 # ZeroDivisionError!
print("Diese Zeile wird nie erreicht")Python meldet hier einen ZeroDivisionError und stoppt. Damit dein Programm trotzdem weiterläuft, fängst du den Fehler ab, statt ihn das Programm beenden zu lassen.
Der grundlegende try/except-Block
Den Code, der schiefgehen könnte, schreibst du in einen try-Block. Was im Fehlerfall passieren soll, kommt in den except-Block. Geht im try-Teil etwas schief, springt Python sofort in den except-Teil, statt abzustürzen.
try:
zahl = int(input("Gib eine Zahl ein: "))
print(f"Das Doppelte ist {zahl * 2}")
except ValueError:
print("Das war keine gültige Zahl!")Gibt der Benutzer hier "abc" ein, kann int() das nicht umwandeln und löst einen ValueError aus. Statt eines Absturzes erscheint eine freundliche Meldung. So bleibt dein Programm stabil.
Verschiedene Fehler gezielt abfangen
Du kannst mehrere except-Blöcke angeben, um auf unterschiedliche Fehlertypen unterschiedlich zu reagieren. Das ist sauberer, als alle Fehler über einen Kamm zu scheren, und hilft dir, präzise Meldungen auszugeben.
def teile(a, b):
try:
return a / b
except ZeroDivisionError:
print("Fehler: Division durch null ist nicht erlaubt.")
except TypeError:
print("Fehler: Bitte nur Zahlen übergeben.")
teile(10, 0) # Fehler: Division durch null ...
teile(10, "x") # Fehler: Bitte nur Zahlen ...
print(teile(10, 2)) # 5.0Mit as kannst du dir die konkrete Fehlermeldung zusätzlich geben lassen, was beim Debuggen sehr hilfreich ist:
try:
werte = [1, 2, 3]
print(werte[10])
except IndexError as fehler:
print(f"Es ist ein Fehler aufgetreten: {fehler}")
# Es ist ein Fehler aufgetreten: list index out of rangeelse und finally
Neben try und except gibt es zwei weitere Blöcke. Der else-Block läuft nur, wenn kein Fehler aufgetreten ist. Der finally-Block läuft immer – egal ob ein Fehler auftrat oder nicht. finally eignet sich perfekt für Aufräumarbeiten, etwa das Schließen einer Datei.
try:
zahl = int("42")
except ValueError:
print("Ungültige Eingabe")
else:
print(f"Alles gut, die Zahl ist {zahl}")
finally:
print("Dieser Block läuft immer.")
# Ausgabe:
# Alles gut, die Zahl ist 42
# Dieser Block läuft immer.Mit dieser Struktur trennst du klar: Was probiert wird, wie auf Fehler reagiert wird, was bei Erfolg passiert und was in jedem Fall geschehen muss.
Eigene Fehler auslösen mit raise
Manchmal willst du selbst einen Fehler auslösen, etwa wenn ein Wert ungültig ist. Dafür gibt es raise. So kannst du deine Funktionen vor falscher Benutzung schützen und aussagekräftige Meldungen geben.
def setze_alter(alter):
if alter < 0:
raise ValueError("Das Alter darf nicht negativ sein.")
return alter
try:
setze_alter(-5)
except ValueError as fehler:
print(fehler) # Das Alter darf nicht negativ sein.Mit raise machst du klar, dass eine bestimmte Eingabe nicht akzeptabel ist. Wer deine Funktion nutzt, bekommt sofort eine verständliche Rückmeldung.
Fazit
Fehlerbehandlung ist kein Zeichen von schlechtem Code, sondern von durchdachtem Code. Mit try/except fängst du Probleme ab, bevor sie dein Programm zum Absturz bringen. Du hast gelernt, wie du verschiedene Fehlertypen gezielt behandelst, mit else und finally den Ablauf strukturierst und mit raise eigene Fehler auslöst. Ein wichtiger Tipp: Fange nur die Fehler ab, mit denen du wirklich rechnest, und vermeide ein nacktes except:, das alles verschluckt. So bleiben echte Bugs sichtbar, während erwartbare Probleme sauber behandelt werden.