Abschnitt 9 · Lektion 3
Eingaben, bis sie passen
Wenn jemand vier statt 4 tippt, endet das Programm mit einem ValueError. Was über input()
hereinkommt, ist Text, und int() macht nur dann eine Zahl daraus, wenn es eine ist. Mit try und
except lässt sich der Fehler abfangen. Nur reicht Abfangen allein nicht.
Abgefangen und trotzdem abgestürzt
vier try:
personen = int(input("Für wie viele Personen? "))
except ValueError:
print("Das war keine Zahl.")
print(f"Tisch für {personen} Personen ist reserviert.") Ein Restaurant will wissen, für wie viele Personen reserviert werden soll, und bekommt vier. Der
ValueError wird abgefangen, da steht Das war keine Zahl., und eine Zeile später bricht das
Programm trotzdem ab. Diesmal mit NameError: name 'personen' is not defined.
Das ist eigentlich logisch. int() ist gescheitert, also ist die Zuweisung an personen nie
passiert, und in der letzten Zeile wird mit einem Wert gearbeitet, den es gar nicht gibt. Wenn ein
Programm eine Antwort braucht, kann es nach einer falschen nicht einfach weitermachen. Es muss noch
einmal fragen.
Fragen, bis es passt
vier
4 while True:
try:
personen = int(input("Für wie viele Personen? "))
break
except ValueError:
print("Bitte eine Zahl eingeben, zum Beispiel 4.")
print(f"Tisch für {personen} Personen ist reserviert.") Das ist die Form aus Lektion 4.4, while True mit break. Neu ist nur das try darin. Wenn die
Umwandlung gelingt, kommt das break dran, und die Schleife ist vorbei. Wenn nicht, springt Python
in den except-Block und überspringt dabei das break, weil es hinter der Zeile steht, die
gescheitert ist. Die Schleife beginnt also von vorn, und es wird noch einmal gefragt. Hinter der
Schleife ist damit sicher, dass personen eine Zahl hat.
In eingabe.txt stehen zwei Antworten, erst vier und dann 4. Im Terminal siehst du den ganzen
Wortwechsel.
Steht eine 0 in der ersten Zeile der Datei, kommt Tisch für 0 Personen ist reserviert. heraus.
Das ist die zweite Art von falsch. Python hat mit dieser Zahl kein Problem, das Restaurant schon,
denn es hat Tische für 1 bis 12 Personen. Ein try hilft hier nicht, weil gar kein Fehler auftritt.
Was hilft, ist ein if nach der Umwandlung. Es prüft, ob die Zahl im erlaubten Bereich liegt, und
das break kommt erst dran, wenn auch das stimmt. Passt die Zahl nicht, gibt es eine Meldung, und
die Frage kommt von vorn.
Wenn in eingabe.txt keine passende Antwort mehr steht, endet das Programm mit dem EOFError aus
Lektion 2.6. Es wird weiter gefragt, aber es kommt nichts mehr. Auf deinem eigenen Rechner tippst du
die Antworten selbst, dort passiert das nicht.
Eine Meldung, die weiterhilft
Wenn eine Frage wiederholt wird, ist die Meldung dazwischen das Einzige, was der Mensch davor zu
lesen bekommt. Bei Falsche Eingabe. weiß er nur, dass er etwas falsch gemacht hat. Was, darf er
raten. Bitte eine Zahl eingeben, zum Beispiel 4. sagt, was erwartet wird, und durch das Beispiel
ist auch klar, dass vier nicht gemeint war. Bei der zweiten Art von falsch ist es genauso. Wer 0
eingibt, braucht nicht Ungültig., sondern den Bereich, der geht.
Zwei Arten von falsch heißt also zwei Meldungen. Mit Höflichkeit hat das wenig zu tun. Wer 20
Personen eingibt und dann liest, er solle eine Zahl eingeben, versteht die Welt nicht mehr. Er hat
ja eine eingegeben.
Eine Funktion, die fragt
zwei
2
1 def frage_zahl(frage):
while True:
try:
return int(input(frage))
except ValueError:
print("Bitte eine ganze Zahl eingeben.")
erwachsene = frage_zahl("Wie viele Erwachsene? ")
kinder = frage_zahl("Wie viele Kinder? ")
print(f"Tisch für {erwachsene + kinder} Personen ist reserviert.") Wenn ein Programm mehr als einmal nach einer Zahl fragt, steht die Schleife sonst zweimal da. Packt
man sie in eine Funktion wie in Abschnitt 8, steht sie nur einmal da, und aus dem break wird ein
return. Sobald die Umwandlung gelingt, gibt die Funktion die Zahl zurück, und damit ist auch die
Schleife vorbei. Bei der ersten Frage braucht es hier zwei Anläufe, bei der zweiten einen.
Was die Aufgabe will
Ein Webshop fragt nach der Menge, und Mias Laden verschickt höchstens 99 Stück je Artikel. Das Programm dort nimmt heute jede Antwort, solange sie eine Zahl ist, und stürzt bei allem anderen ab. Es soll so lange fragen, bis eine Menge kommt, die passt, und für jede der beiden Arten von falsch eine eigene Meldung haben.
Zum Mitnehmen
Wenn ein Programm eine Antwort braucht, fragt es in einer while-True-Schleife so lange, bis eine brauchbare kommt, mit try um die Umwandlung und break erst am Ende. Falsch sein kann eine Antwort als Wort statt Zahl oder als Zahl, die keinen Sinn ergibt. Beide Fälle bekommen ihre eigene Meldung, und die sagt, was erwartet wird.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 3 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.