0%

Fouten, validatie en debuggen · oefening

Bekijk waarden voordat je gaat gokken

Logische fouten leveren geen traceback op. Wanneer het eindresultaat verkeerd is, bekijk je de waarden die ertoe leiden.

Stel dat een opdracht niet wordt herkend:

raw_choice = "  START "
choice = raw_choice.lower()

if choice == "start":
    print("Starting")
else:
    print("Unknown command")

Je zou kunnen gokken dat lower() niet werkt of dat de vergelijking verkeerd is. Een tijdelijke afdruk voor onderzoek geeft beter bewijs:

print(f"raw: >{raw_choice}<")
print(f"cleaned: >{choice}<")

De zichtbare markeringen laten spaties rond de tekst zien:

raw: >  START <
cleaned: >  start <

De letters werden kleine letters, maar de spaties bleven staan. Nu is de volgende wijziging onderbouwd: verwijder bij het opschonen ook de witruimte aan de buitenkant.

Nuttige dingen om te bekijken

Druk tijdens het debuggen het volgende af:

  • een waarde met een label;

  • begrenzers rond strings zodat witruimte zichtbaar is;

  • type(value) wanneer een aanname over het type verkeerd kan zijn;

  • waarden vóór en na een omzetting;

  • waarden direct vóór een falende voorwaarde of berekening.

Bijvoorbeeld:

print("quantity:", quantity)
print("quantity type:", type(quantity))

Een beschrijvend label is belangrijk. Een terminal vol losse getallen is moeilijk te interpreteren.

Houd diagnostische uitvoer tijdelijk

Diagnostische uitvoer is bedoeld voor onderzoek en hoort niet bij het beloofde resultaat van het programma. Zodra de oorzaak is verholpen:

  1. voer het programma uit en bevestig de oplossing;

  2. verwijder de tijdelijke afdrukken;

  3. voer het opnieuw uit om te bevestigen dat de uiteindelijke uitvoer geen extra regels bevat.

Je kunt ook Step in een editoroefening gebruiken om variabelen per instructie te zien veranderen. Tijdelijke afdrukken blijven een waardevolle algemene techniek, omdat ze werken in kleine programma’s, functies, lussen en de meeste uitvoeromgevingen.

Test een aanname in plaats van een gok aan te kleden

Elke diagnostische afdruk moet een vraag beantwoorden:

  • Bevat deze string nog spaties?

  • Is deze waarde een geheel getal of een string?

  • Welke tak koos de voorwaarde?

  • Wat zijn de operanden vóór de berekening?

Als een afdruk niet helpt mogelijke oorzaken van elkaar te onderscheiden, kies dan een gerichtere.

Waarom zijn > en < handig rond een string in een diagnostische afdruk?

Opdracht

Het startprogramma moet de voorbereide opdracht accepteren, ondanks de hoofdletters en spaties eromheen. Op dit moment wijst het programma die af.

Voer het programma eerst uit met de twee diagnostische regels. Gebruik de uitvoer om te bepalen wat de opschoningsstap heeft gemist. Daarna:

  1. herstel de expressie voor het opschonen;

  2. verwijder beide tijdelijke diagnostische afdrukken;

  3. voer het programma opnieuw uit.

De uiteindelijke uitvoer mag alleen dit bevatten:

Command accepted.

Gebruik zodra het werkt Step op je afgeronde code om te zien hoe raw_code en clean_code hun waarden ontvangen.