← Python/Foutafhandeling
Les 1 van 8
MODULE 06 · 01◷ 22 min

Een traceback als routekaart lezen

Na deze les kun je
  • Het fouttype en de laatste eigen bewerking in een traceback vinden.
  • De route door aanroepende functies onderscheiden van de daadwerkelijke fout.
  • Geldige berekeningen herstellen zonder conversiefouten te verbergen.

Een factuur rekent prima met je proefgegevens, maar stopt zodra iemand vier als aantal invoert. De foutmelding lijkt lang omdat meerdere functies aan de berekening meedoen. In deze les leer je de route naar het probleem volgen, voordat je probeert een fout af te vangen.

Begin onderaan

Een exception onderbreekt de gewone uitvoering wanneer een bewerking niet kan doorgaan. De bijbehorende traceback beschrijft welke aanroepen naar de mislukte bewerking hebben geleid. Je kent al voorbeelden zoals een ongeldige getalconversie en een ontbrekende dictionarysleutel.

Lees eerst de onderste regel: daar staan het fouttype en de toelichting. ValueError betekent bijvoorbeeld dat een bewerking het soort waarde wel accepteert, maar deze inhoud niet kan verwerken. int("vier") krijgt tekst, zoals toegestaan, maar die tekst stelt geen geheel getal voor.

Ga daarna één stap omhoog naar de laatste regel uit je eigen programma. Bekijk welke bewerking daar plaatsvindt en welke waarden zij krijgt. De precieze bestandsnaam kan per uitvoeromgeving verschillen; de functie en de mislukte bewerking geven je het bruikbare spoor.

Volg de aanroepen terug

De aanroepketen is de reeks functies die elkaar aanroepen. Bij een gewone traceback staan eerdere aanroepen bovenaan en de meest recente onderaan. Een buitenste functie kan daardoor in de melding staan terwijl de daadwerkelijke fout dieper ontstaat.

Wat je leestWat je ermee doet
Onderste regel met fouttypeBepalen welk soort bewerking mislukte
Laatste eigen functieregelInvoer en bewerking op die plek onderzoeken
Eerdere functieregelsTerugzoeken waar die invoer vandaan kwam

Bekijk eerst deze reisplanner met een bestaande rit. Voorspel welke functie de spoorinformatie opzoekt en welke functie alleen de zin samenstelt.

Twee functies voor een bekende rit
def platform_for(code):
    platforms = {"IC24": 7}
    return platforms[code]

def trip_message(code):
    return f"Trein {code}: spoor {platform_for(code)}"

print(trip_message("IC24"))
Verwachte uitvoer
Trein IC24: spoor 7

Dezelfde twee functies krijgen hieronder een onbekende rit. Voer het voorbeeld uit en zoek platform_for onder trip_message in de traceback. De onderste regel noemt nu KeyError: de opgevraagde sleutel ontbreekt in de dictionary.

Een ontbrekende sleutel door de keten volgen
def platform_for(code):
    platforms = {"IC24": 7}
    return platforms[code]

def trip_message(code):
    return f"Trein {code}: spoor {platform_for(code)}"

print(trip_message("IC99"))
Verwachte fout
KeyError: 'IC99'

De formattering van de zin veroorzaakt hier geen probleem. De dictionary bevat eenvoudigweg geen spoor voor IC99. Door de aanroepketen terug te volgen, vind je zowel de mislukte lookup als de plek waar de onbekende rit werd doorgegeven.

Veelgemaakte fout: de melding verplaatsen

Een typische reactie is overal dezelfde vervangende waarde teruggeven totdat de foutmelding verdwijnt. Dan lijkt het programma weer te werken, maar een onbekend aantal kan opeens een factuur van nul euro opleveren. Je hebt het probleem verborgen en een onjuist resultaat toegevoegd.

Onderzoek daarom eerst wat het contract van de functie vraagt. Een geldige invoer moet een juiste berekening geven; ongeldige getaltekst mag hier een echte conversiefout blijven. In de volgende les leer je op een bewuste plek zo'n fout afhandelen.

Jouw factuurketen

Je gebruikt de bekende functies int en float voor twee afzonderlijke conversies. cost vermenigvuldigt de ontvangen waarden, en invoice verbindt de conversies met die berekening. Elk onderdeel krijgt eigen tests, zodat een fout in een buitenste functie geen excuus is om de binnenste functies over te slaan.

Deze oefening toetst geen bedrijfsregels: nul en negatieve waarden blijven gewone getallen. Rond bedragen niet af en verander ongeldige tekst niet in nul. Wanneer een conversie mislukt, moet diezelfde fout de aanroeper bereiken.

AAN DE SLAG 0/4
1

Aantal omzetten

Maak read_count(text) die de tekst met int omzet naar een geheel getal. Witruimte en een minteken zijn toegestaan; ongeldige getaltekst moet ValueError blijven geven.

2

Tarief omzetten

Maak read_rate(text) die de tekst met float omzet. Bewaar decimalen en negatieve waarden; ongeldige tekst moet de echte conversiefout doorgeven.

3

Zuiver rekenen

Maak cost(count, rate) die count met rate vermenigvuldigt. Rond niet af; nul en negatieve waarden blijven hier toegestaan.

4

De keten verbinden

Maak invoice(count_text, rate_text) die beide conversiefuncties aanroept en hun resultaten met cost berekent. Verberg een fout in geen van beide conversies.

Onthoud dit

  • Lees eerst het fouttype onderaan en onderzoek daarna de laatste eigen bewerking.
  • Een traceback toont de route door functies; niet elke genoemde regel veroorzaakt de fout.
  • Een verdwenen foutmelding bewijst nog geen juiste uitkomst.

Hierna vang je een verwachte conversiefout gericht af met try en except.

main.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.