Fehlerbehebung
# try · except · else · finally · raise · custom exceptions
try:
x = int(input("Zahl: "))
print(f"Du hast {{"{x}"}} eingegeben")
except ValueError:
print("Das war keine gültige Zahl 😅")
Warum Fehlerbehandlung wichtig ist
Fehler passieren immer: falsche Eingaben, fehlende Dateien, Netzwerkprobleme oder Logikfehler. Gute Fehlerbehandlung sorgt dafür, dass dein Programm nicht einfach abstürzt, sondern kontrolliert reagiert (z.B. eine Meldung ausgibt, neu fragt oder sauber beendet).
SyntaxError vs. Exceptions
Es gibt grob zwei Kategorien: Syntaxfehler (dein Code ist nicht gültig) und Exceptions (Fehler während das Programm läuft).
print("Oops")
# → SyntaxError: ':' fehlt
# → ZeroDivisionError
| Exception | Wann? | Beispiel |
|---|---|---|
ValueError |
Wert passt nicht zum Typ/Format | int("abc") |
TypeError |
Falscher Typ in Operation | "5" + 2 |
ZeroDivisionError |
Division durch 0 | 10/0 |
FileNotFoundError |
Datei existiert nicht | open("x.txt") |
KeyError |
Key fehlt im Dictionary | d["x"] |
IndexError |
Index außerhalb Liste | lst[99] |
try: Risiko · except: Reaktion
Mit try führst du Code aus,
der schiefgehen kann. Wenn eine Exception auftritt, springt Python in den passenden
except-Block.
except: ab.
Besser: konkrete Exceptions (z.B. ValueError). Sonst versteckst du echte Bugs.
else läuft nur, wenn kein Fehler passiert
Der else-Block ist super,
wenn du Code trennen willst: try nur „gefährlich“, else nur „okay“.
finally läuft immer
Der finally-Block wird
immer ausgeführt – egal ob Fehler oder nicht.
Perfekt für Cleanup (Dateien schließen, Verbindungen beenden).
finally ist oft der Kontextmanager:
with open(...). Der schließt die Datei automatisch.
Mehrere Exceptions elegant behandeln
Du kannst mehrere Exceptions entweder einzeln abfangen oder in einer Klammer zusammenfassen. Außerdem kannst du die Fehlermeldung in eine Variable speichern.
Fehler bewusst auslösen
Mit raise kannst du selbst
eine Exception auslösen – z.B. wenn eine Eingabe ungültig ist.
Eigene Fehlerklassen erstellen
Manchmal willst du Fehler klarer benennen. Dann erstellst du eine eigene Exception.
Das ist einfach eine Klasse, die von Exception erbt.
assert für Annahmen (Debug)
assert ist eine
„Sicherheitsleine“: Du prüfst Annahmen im Code. Wenn sie falsch sind, gibt es eine
AssertionError.
assert ist eher für Debug/Entwicklung.
Für echte Nutzer-Eingaben ist raise + saubere Fehlerbehandlung oft besser.
Mini-Projekt: Zahlenrechner (robust)
Ziel: Ein kleiner Rechner, der wiederholt zwei Zahlen und einen Operator abfragt. Er soll nicht abstürzen, sondern sauber Fehler melden und neu fragen.
Stabiler Code = besserer Code. Mit Fehlerbehandlung bist du schon deutlich "Pro" unterwegs. Als nächstes passen super: Module & Pakete oder kleine Praxisprojekte.