0%

Fouten, validatie en debuggen · oefening

Herstel de oorzaak, niet het symptoom

Een programma kan lijken te herstellen terwijl de echte fout blijft bestaan.

Stel je voor dat elk evenementrecord deze sleutels moet bevatten:

event = {
    "name": "Night market",
    "city": "Taipei",
}

Het programma vraagt per ongeluk om een andere sleutel:

try:
    print(event["location"])
except KeyError:
    print("Location unavailable.")

De foutafhandeling voorkomt een traceback, maar verbergt ook dat de verplichte structuur van het record en de zoekopdracht niet overeenkomen. Als "city" verplicht is, is het gebruiken van de juiste verplichte sleutel de zinvolle oplossing.

Optionele gegevens zijn anders

Soms is een veld echt optioneel:

print(event.get("website", "No website listed"))

Hoofdstuk 9 introduceerde .get() voor deze situatie. Een ontbrekende optionele website is een normale gegevenssituatie, niet noodzakelijk een fout.

Het onderscheid zit in de eis:

  • verplichte sleutel ontbreekt of is verkeerd gespeld: onderzoek en herstel de gegevens of de zoekopdracht;

  • optionele sleutel ontbreekt: gebruik een vastgelegde standaardwaarde;

  • externe of onzekere gegevens: valideer die op de grens waar ze het programma binnenkomen.

Baseer je keuze niet alleen op de vraag of een exceptie kan worden opgevangen.

Volg het bewijs terug naar de bron

Wanneer het opzoeken van een verplichte sleutel een KeyError veroorzaakt:

  1. lees de ontbrekende sleutel die onderaan de traceback wordt genoemd;

  2. bekijk de werkelijke inhoud van de dictionary;

  3. vergelijk beide met het gegevensontwerp van het programma;

  4. herstel de plek die dat ontwerp schendt.

De dictionary tijdelijk afdrukken kan tijdens het onderzoek helpen:

print(event)

Verwijder die diagnostische afdruk zodra de oorzaak duidelijk is.

Herstel moet de betekenis behouden

Een standaardwaarde zoals "unavailable" verandert de betekenis van het programma. Die zegt dat ontbrekende gegevens acceptabel zijn. Dat kan juist zijn voor een optioneel veld, maar onjuist voor een verplicht veld.

Goed debuggen doet meer dan een fout stil krijgen. Het herstelt het gedrag dat het programma belooft.

Een dictionaryformaat vereist de sleutel "email", maar de code zoekt "mail" op en vangt de resulterende KeyError op. Wat is de beste eerste oplossing?

Opdracht

Het catalogusformaat vereist dat elk item de sleutels "title" en "creator" heeft.

Het startprogramma vangt een KeyError op en drukt een vervangend bericht af, maar de verplichte maker is al aanwezig. Herstel de oorzaak:

  • gebruik de juiste verplichte sleutel;

  • verwijder de onnodige try en except;

  • behoud de voorbereide dictionary.

Het uiteindelijke programma mag alleen dit afdrukken:

Creator: Octavia E. Butler