0%

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:

  1. Starte eine Schleife.

  2. Lies mit der übergebenen Eingabeaufforderung eine Antwort ein.

  3. Versuche, die Antwort mit int() umzuwandeln.

  4. Wenn die Umwandlung einen ValueError auslöst, erkläre, dass eine ganze Zahl erforderlich ist, und frage erneut.

  5. Wenn die umgewandelte Zahl kleiner als null ist, erkläre, dass null oder mehr erforderlich ist, und frage erneut.

  6. 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 ValueError abfangen, 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.