Voraussetzungen
Du kennst die Inhalte aus Teil 12 und arbeitest mit einem lokalen Python-3-Interpreter (ab Python 3.10), beispielsweise in Thonny.
Das lernst du in dieser Lektion
- Syntax-, Laufzeit- und Logikfehler unterscheiden.
- ValueError gezielt abfangen.
- Mit dem Debugger Werte verfolgen.
Drei verschiedene Fehlerarten
Ein SyntaxError verhindert, dass Python den Code korrekt einliest. Eine Ausnahme wie ValueError entsteht während der Ausführung, beispielsweise bei int("Hallo"). Ein Logikfehler erzeugt unter Umständen gar keine Fehlermeldung: Das Programm läuft, rechnet aber falsch.
Bei einem Traceback stehen die beteiligten Aufrufe, Dateien und Zeilennummern. Lies zuerst die letzte Zeile: Dort stehen Ausnahmetyp und Beschreibung. Gehe dann zur angegebenen Stelle im eigenen Code. Der Fehlertext kann je nach Python-Version etwas anders aussehen.
Erwartbare Fehler behandeln
try:
anzahl = int(input("Stückzahl: "))
except ValueError:
print("Bitte eine ganze Zahl eingeben.")
else:
print(f"Übernommen: {anzahl}")
Im try-Block steht die gefährdete Operation. Passt der Fehler zum genannten Typ, läuft except. else wird nur ausgeführt, wenn in try keine Ausnahme aufgetreten ist. Die Fehlermeldung verhindert den Absturz, fragt aber noch nicht erneut. Dafür kombinieren wir Fehlerbehandlung und Schleife.
Bis zu einer gültigen Eingabe fragen
def frage_positive_menge():
while True:
text = input("Menge in g, größer als 0: ").strip()
try:
menge_g = float(text.replace(",", "."))
except ValueError:
print("Bitte eine Zahl ohne Tausendertrennzeichen eingeben.")
continue
if not 0 < menge_g < float("inf"):
print("Bitte eine endliche Zahl größer als 0 eingeben.")
continue
return menge_g
menge_g = frage_positive_menge()
print(f"Übernommen: {menge_g:.1f} g")
Die Zahlenumwandlung und die fachliche Prüfung sind unterschiedliche Schritte. Eine negative Zahl ist syntaktisch eine gültige Zahl, hier aber keine gültige Menge. Auch float()-Sonderwerte wie nan und inf sollen keine Materialmengen werden. Der Bereichsvergleich weist sie zurück. In Teil 15 lernen wir mit math.isfinite() eine ausdrücklich dafür gedachte Funktion kennen.
Fehler selbst auslösen
Eine Funktion kann mit raise ValueError("Menge muss positiv sein") eine ungültige Übergabe melden. Das ist hilfreich, wenn ihre Voraussetzungen verletzt werden. Fange Fehler dort ab, wo du sinnvoll darauf reagieren kannst. Ein pauschales except: würde auch Fehler verstecken, die du eigentlich beheben musst.
Schrittweise untersuchen
Öffne das Kostenbeispiel in Thonny. Starte den Debugmodus über das Menü oder Strg+F5 und gehe mit der angebotenen Schritt-Funktion weiter. Beobachte zuerst die Eingaben, dann Zwischenergebnisse und schließlich die Ausgabe. Alternativ helfen vorübergehend zusätzliche print()-Anweisungen.
Ändere bei der Fehlersuche immer nur eine Sache und wiederhole denselben Test. So erkennst du, ob die Änderung die Ursache behoben hat.
Mitmach-Aufgabe
Frage eine nicht negative ganze Stückzahl ab. Bei Text oder negativen Zahlen soll erneut gefragt werden. 0 ist ausdrücklich erlaubt.
Versuche die Aufgabe zuerst selbst. Vergleiche danach deinen Ansatz mit der Musterlösung. Andere Lösungen sind möglich, wenn sie dieselben Anforderungen erfüllen.
Musterlösung
while True:
try:
anzahl = int(input("Stückzahl ab 0: "))
except ValueError:
print("Bitte eine ganze Zahl eingeben.")
continue
if anzahl < 0:
print("Negative Zahlen sind nicht erlaubt.")
continue
break
print(f"Stückzahl: {anzahl}")
Ergebnis prüfen
Teste Hallo, -2 und 0 nacheinander. Die ersten beiden Eingaben werden zurückgewiesen, 0 wird übernommen.
Typische Stolperstellen
Fehlerbehandlung behebt keine falsche Formel. Beschränke try auf die Operationen, deren Fehler du erwartest. Eine leer gelassene Eingabe ist ebenfalls kein gültiger Integer.
Was du jetzt kannst
- Syntax-, Laufzeit- und Logikfehler unterscheiden.
- ValueError gezielt abfangen.
- Mit dem Debugger Werte verfolgen.
Passendes Cheatsheet
Zum Nachschlagen: Cheatsheet 10 – Fehlerbehandlung und Debugging. Dort findest du auch den vorhandenen PDF-Download.
Im nächsten Teil
In Teil 14 geht es um Textdateien lesen, schreiben und Pfade verstehen. Speichere Ergebnisse dauerhaft und lerne, wo dein Programm seine Dateien anlegt.
