0%

Fouten, validatie en debuggen · oefening

Probeer opnieuw met try en except

Een omzetfunctie kan None teruggeven, maar een interactief programma heeft vaak een geldig antwoord nodig voordat het verder kan. Combineer een lus met try en except:

while True:
    text = input("Temperature: ")

    try:
        temperature = int(text)
    except ValueError:
        print("Enter a whole-number temperature.")
        continue

    break

print(f"Recorded: {temperature}")

Volg de twee paden

Bij ongeldige tekst:

  1. veroorzaakt int(text) een ValueError;

  2. springt Python naar except ValueError;

  3. drukt het programma bruikbare uitleg af;

  4. begint continue de volgende ronde van de lus.

Bij geldige tekst voor een geheel getal:

  1. slaagt de omzetting;

  2. wordt de foutafhandeling overgeslagen;

  3. verlaat break de lus.

Alleen het geslaagde pad bereikt de laatste afdrukinstructie.

Deze stroom houdt zowel het pad voor opnieuw proberen als het geslaagde pad zichtbaar. Volg de rode kant terug naar een nieuwe invoerpoging; volg de groene kant via break naar de opgeslagen waarde. In de figuur betekent “Input text” invoertekst, “Failure” mislukking en “Guidance” uitleg. “Success: integer” betekent dat de omzetting een geheel getal opleverde; “Recorded value” is de opgeslagen waarde.

Invoertekst gaat naar de omzetting met int; bij ValueError wordt uitleg afgedrukt en volgt een nieuwe poging, terwijl bij succes het gehele getal wordt opgeslagen en de lus wordt verlaten.

Waarom dit meer accepteert dan .isdigit()

Het programma laat int() bepalen of de omzetting werkt. Het accepteert daarom strings zoals:

"12"
"-7"
"+4"

Het wijst strings af zoals:

"three"
"4.5"

Dit past bij een eis die elk geheel getal toestaat, ook negatieve gehele getallen. Als het programma een niet-negatieve waarde nodig heeft, is omzetten slechts de eerste validatiestap. Controleer na de omzetting ook het numerieke bereik. Het hoofdstukproject doet precies dat.

Plaats break zorgvuldig

Zet break niet direct na input(). Dat zou de lus beëindigen voordat een mislukte omzetting een nieuwe poging kan starten.

Vergeet niet binnen de lus een nieuw antwoord op te halen. Steeds dezelfde ongeldige string controleren zou een programma opleveren dat nooit verder komt.

Als je programma blijft draaien zonder verder te komen, gebruik dan Stop bij de editorbediening. Volg daarna de paden door je lus: een ongeldig antwoord moet naar een nieuwe aanroep van input() leiden en een geldig antwoord moet break of return bereiken.

Wat gebeurt er wanneer deze code wordt uitgevoerd?

text = "-5"

try:
    number = int(text)
except ValueError:
    print("Not an integer")

Opdracht

Schrijf een lus die blijft vragen totdat de gebruiker een geheel getal invoert.

Stel deze vraag:

Enter an integer: 

Druk dit af wanneer de omzetting een ValueError veroorzaakt:

That was not an integer. Try again.

Haal daarna een nieuw antwoord op. Verlaat de lus zodra de omzetting slaagt en druk dit af:

Accepted: -7

De voorbereide antwoorden zijn three, 4.5 en -7. Vang alleen ValueError op. Een negatief geheel getal is geldig voor deze oefening.