Fouten, validatie en debuggen · eindproject
Eindproject: Project: maak de uitjesplanner robuust
In hoofdstuk 3 maakte je een uitjesplanner interactief. Die vroeg om een activiteit, het aantal personen, een prijs per persoon en een snackbudget. Daarna berekende het programma het totaal voor de kaartjes en het totale budget.
Die eerste versie nam aan dat elk numeriek antwoord direct kon worden omgezet:
people = int(input("Number of people: "))
Nu kun je hetzelfde programma robuuster maken zonder het nuttige rapport te veranderen.
Scheid invoerwerk van planningswerk
Maak een herbruikbare functie met de naam read_nonnegative_integer. Die ontvangt een vraag als string en geeft een geldig geheel getal terug.
De programmastroom moet als volgt zijn:
start een lus;
haal een antwoord op met de meegegeven vraag;
probeer het antwoord om te zetten met
int();als de omzetting een
ValueErrorveroorzaakt, leg dan uit dat een geheel getal nodig is en probeer opnieuw;als het omgezette getal onder nul ligt, leg dan uit dat nul of hoger vereist is en probeer opnieuw;
geef het geldige getal terug.
Merk op dat twee soorten ongeldige gegevens verschillende controles nodig hebben:
"many"kan niet naar een geheel getal worden omgezet;"-3"wordt met succes omgezet, maar schendt de regel dat het getal niet negatief mag zijn.
Exceptieafhandeling behandelt de mislukte bewerking. Een voorwaarde behandelt het onacceptabele resultaat.
Laat return de lus beëindigen
De functie kan terugkeren zodra ze een geldig getal heeft. Een aparte break is niet nodig, omdat return zowel de lus als de functie verlaat.
Elk ongeldig pad moet een nieuw antwoord ophalen. Zo komt het programma verder in plaats van eindeloos dezelfde waarde te controleren.
Hergebruik één geteste regel
Roep de hulpfunctie drie keer aan:
aantal personen;
prijs per persoon;
snackbudget.
Zo blijft de validatieregel op één plek. Als de formulering of de bereikregel later verandert, hoef je maar één functie bij te werken.
De activiteit blijft tekst. Vraag er één keer om en gebruik .strip() om onbedoelde witruimte aan de buitenkant te verwijderen.
Behoud de berekening
Behoud de oorspronkelijke formules zodra geldige waarden beschikbaar zijn:
ticket_total = people * price_per_person
total_budget = ticket_total + snack_budget
Validatie beschermt deze berekeningen tegen ongeschikte invoer. Ze vervangt de berekeningen niet.
Test fouten vóór succes
Een nuttige test geeft niet alleen perfecte antwoorden. Probeer bij elke numerieke vraag minstens één ongeldige waarde vóór de geldige. Bevestig dat:
ongeldige tekst uitleg krijgt over gehele getallen;
een negatief geheel getal uitleg krijgt over het bereik;
de vraag opnieuw verschijnt;
het eindrapport de geaccepteerde waarden gebruikt;
er geen traceback verschijnt.
Dit project combineert reproduceerbaar testen, specifieke exceptieafhandeling, bereikvalidatie, lussen, functies en de berekeningen uit het eerdere project.
Waarom moet de hulpfunctie number < 0 controleren na try en except?
Wat doet return number wanneer die instructie binnen de lus van de hulpfunctie wordt uitgevoerd?
Opdracht
Maak de uitjesplanner uit hoofdstuk 3 robuust.
Definieer read_nonnegative_integer(prompt). Die moet herhaaldelijk:
de meegegeven vraag stellen;
proberen om te zetten met
int();alleen
ValueErroropvangen,Please enter a whole number.afdrukken en opnieuw proberen;omgezette waarden onder nul afwijzen door
Please enter zero or more.af te drukken;het eerste geldige niet-negatieve gehele getal teruggeven.
Vraag één keer om de activiteit met Activity: en verwijder witruimte aan de buitenkant. Gebruik je hulpfunctie voor:
Number of people:Price per person: $Snack budget: $
Bereken daarna ticket_total en total_budget precies zoals in de eerdere planner en druk dit rapport af:
OUTING PLAN
Activity: planetarium
People: 4
Tickets: $52
Total budget: $70
De voorbereide invoer geeft bewust ongeldige antwoorden vóór de geldige. Je lus moet daarvan allemaal herstellen zonder onverwachte programmeerfouten te verbergen.