Fehler, Validierung und Fehlersuche · Abschlussprojekt
Abschlussprojekt: Projekt: Mache den Ausflugsplaner robust
In Kapitel 3 hast du einen Ausflugsplaner interaktiv gemacht. Er fragte nach einer Aktivität, der Personenzahl, einem Preis pro Person und einem Snackbudget. Dann berechnete er die Gesamtkosten der Tickets und das Gesamtbudget.
Diese erste Version nahm an, dass sich jede numerische Antwort sofort umwandeln lässt:
people = int(input("Number of people: "))
Jetzt kannst du dasselbe Programm robuster machen, ohne seinen nützlichen Bericht zu verändern.
Trenne die Eingabeverarbeitung von der Planung
Erstelle eine wiederverwendbare Funktion namens read_nonnegative_integer. Sie erhält einen String mit einer Eingabeaufforderung und gibt eine gültige ganze Zahl zurück.
Ihr Ablauf sollte so aussehen:
Starte eine Schleife.
Lies mit der übergebenen Eingabeaufforderung eine Antwort ein.
Versuche, die Antwort mit
int()umzuwandeln.Wenn die Umwandlung einen
ValueErrorauslöst, erkläre, dass eine ganze Zahl erforderlich ist, und frage erneut.Wenn die umgewandelte Zahl kleiner als null ist, erkläre, dass null oder mehr erforderlich ist, und frage erneut.
Gib die gültige Zahl zurück.
Beachte, dass zwei Arten ungültiger Daten unterschiedliche Prüfungen brauchen:
"many"lässt sich nicht in eine ganze Zahl umwandeln;"-3"lässt sich erfolgreich umwandeln, verletzt aber die Regel, dass der Wert nicht negativ sein darf.
Die Ausnahmebehandlung kümmert sich um die fehlgeschlagene Operation. Eine Bedingung prüft das unzulässige Ergebnis.
Lass return die Schleife beenden
Die Funktion kann zurückkehren, sobald sie eine gültige Zahl hat. Ein separates break ist unnötig, weil return sowohl die Schleife als auch die Funktion verlässt.
Jeder Weg für ungültige Eingaben muss eine weitere Antwort einlesen. So kommt das Programm voran, statt denselben Wert endlos zu prüfen.
Verwende eine geprüfte Regel mehrfach
Rufe die Hilfsfunktion dreimal auf:
für die Personenzahl;
für den Preis pro Person;
für das Snackbudget.
So bleibt die Validierungsregel an einer Stelle. Wenn sich später der Wortlaut oder der erlaubte Wertebereich ändert, muss eine Funktion angepasst werden.
Die Aktivität bleibt Text. Frage sie einmal ab und entferne mit .strip() versehentliche Leerraumzeichen am Anfang und Ende.
Behalte die Berechnung bei
Sobald gültige Werte vorliegen, behalte die ursprünglichen Formeln bei:
ticket_total = people * price_per_person
total_budget = ticket_total + snack_budget
Die Validierung schützt diese Berechnungen vor ungeeigneten Eingaben. Sie ersetzt sie nicht.
Teste Fehler vor dem Erfolg
Ein hilfreicher Test liefert nicht nur perfekte Antworten. Probiere bei jeder numerischen Eingabeaufforderung mindestens einen ungültigen Wert vor dem gültigen aus. Bestätige Folgendes:
Ungültiger Text erhält einen Hinweis auf die erforderliche ganze Zahl.
Eine negative ganze Zahl erhält einen Hinweis auf den erlaubten Wertebereich.
Die Eingabeaufforderung erscheint erneut.
Der abschließende Bericht verwendet die akzeptierten Werte.
Es erscheint kein Traceback.
Dieses Projekt verbindet reproduzierbare Tests, gezielte Ausnahmebehandlung, die Prüfung von Wertebereichen, Schleifen, Funktionen und die Berechnungen aus dem früheren Projekt.
Warum sollte die Hilfsfunktion number < 0 nach try und except prüfen?
Was bewirkt return number, wenn es innerhalb der Schleife der Hilfsfunktion ausgeführt wird?
Aufgabe
Mache den Ausflugsplaner aus Kapitel 3 robust.
Definiere read_nonnegative_integer(prompt). Die Funktion muss wiederholt:
mit der übergebenen Eingabeaufforderung fragen;
eine Umwandlung mit
int()versuchen;nur
ValueErrorabfangen,Please enter a whole number.ausgeben und erneut fragen;umgewandelte Werte unter null mit der Ausgabe
Please enter zero or more.ablehnen;die erste gültige, nicht negative ganze Zahl zurückgeben.
Frage die Aktivität einmal mit Activity: ab und entferne umgebende Leerraumzeichen. Verwende deine Hilfsfunktion für:
Number of people:Price per person: $Snack budget: $
Berechne dann ticket_total und total_budget genau wie im früheren Planer und gib diesen Bericht aus:
OUTING PLAN
Activity: planetarium
People: 4
Tickets: $52
Total budget: $70
Die vorbereitete Eingabe liefert absichtlich ungültige Antworten vor den gültigen. Deine Schleife muss nach allen diesen ungültigen Antworten sinnvoll weiterarbeiten, ohne unerwartete Programmierfehler zu verbergen.