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.
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.
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.
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 leest | Wat je ermee doet |
|---|---|
| Onderste regel met fouttype | Bepalen welk soort bewerking mislukte |
| Laatste eigen functieregel | Invoer en bewerking op die plek onderzoeken |
| Eerdere functieregels | Terugzoeken 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.
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"))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.
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"))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.
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.
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.
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.
Maak read_rate(text) die de tekst met float omzet. Bewaar decimalen en negatieve waarden; ongeldige tekst moet de echte conversiefout doorgeven.
Maak cost(count, rate) die count met rate vermenigvuldigt. Rond niet af; nul en negatieve waarden blijven hier toegestaan.
Maak invoice(count_text, rate_text) die beide conversiefuncties aanroept en hun resultaten met cost berekent. Verberg een fout in geen van beide conversies.
Hierna vang je een verwachte conversiefout gericht af met try en except.
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.