← Python/Foutafhandeling
Les 2 van 8
MODULE 06 · 02◷ 24 min

Een verwachte fout gericht afhandelen

Na deze les kun je
  • De uitvoering door try en except volgen.
  • Een afgesproken terugvalwaarde alleen bij een fout kiezen.
  • Geldige invoer na een mislukte conversie blijven verwerken.

Een meetlijst bevat drie bruikbare temperaturen en één beschadigde waarde. Het hele programma laten stoppen is onhandig, maar die waarde stilzwijgend als nul meetellen is ook onjuist. Met gerichte foutafhandeling bepaal je welke mislukking je kunt opvangen en hoe je daarna verdergaat.

Een klein stuk proberen

Een try-blok bevat een bewerking die een verwachte fout kan opleveren. Een aansluitend except-blok beschrijft wat er moet gebeuren wanneer dat fouttype optreedt. Zo'n afhandelend blok heet ook een handler.

De uitvoering begint in try. Gaat alles goed, dan slaat Python de handler over en gaat het programma na de constructie verder. Ontstaat de genoemde fout, dan stopt de resterende code in try meteen en wordt de passende handler uitgevoerd.

De mislukte regel wordt dus niet automatisch opnieuw geprobeerd. Je beslist zelf of je een vervangende waarde teruggeeft, een invoer overslaat of later nog een poging vraagt. Vandaag gebruiken we alleen bestaande waarden; interactieve invoerlussen komen niet aan bod.

Een meetwaarde overslaan

In het voorbeeld wordt iedere meting afzonderlijk naar float omgezet. De tekst kapot levert ValueError op, waarna alleen die meting een melding krijgt. Voorspel ook wat de geldige tekst 0 doet: die hoort gewoon een meetwaarde op te leveren.

Elke meetwaarde krijgt haar eigen poging
for reading in ["18.5", "kapot", "0"]:
    try:
        value = float(reading)
        print(value)
    except ValueError:
        print("Geen getal:", reading)
print("Verder")
Verwachte uitvoer
18.5
Geen getal: kapot
0.0
Verder

Na een afgehandelde fout gaat de lus door met haar volgende ronde. De afsluitende regel verschijnt ook, omdat geen onafgehandelde fout het programma heeft verlaten. De handler verandert daarmee bewust de route van de uitvoering.

Een handler past alleen bij het vermelde fouttype. Het volgende voorbeeld noemt TypeError, terwijl de inhoud van de tekst juist een ValueError veroorzaakt. Voer het uit en controleer dat de verkeerde handler de fout niet wegneemt.

Een handler voor een ander type helpt niet
try:
    print(float("snel"))
except TypeError:
    print("Verkeerd soort argument")
Verwachte fout
ValueError: could not convert string to float: 'snel'

Je hoeft fouttypen nog niet allemaal te onthouden. Lees de onderste tracebackregel, controleer welke bewerking je uitvoert en kies de fout waarvoor je werkelijk een herstelregel hebt. In de volgende les leer je bovendien hoe je meerdere typen uit elkaar houdt.

Kies een duidelijke uitkomst

Een vervangende waarde moet onderdeel van het functiecontract zijn. Bij count_or geeft de aanroeper de terugvalwaarde mee; bij read_pair betekent None dat minstens één conversie mislukte. Die afspraken maken een mislukking zichtbaar zonder een willekeurig geldig getal te verzinnen.

Een verzamelfunctie heeft weer een andere afspraak: zij slaat ongeldige getaltekst over en bewaart de overige aantallen in volgorde. Door de try binnen de lus te zetten, krijgt elke invoer haar eigen kans. Eén fout aan de buitenkant van de hele lus opvangen zou ook latere geldige waarden kunnen verliezen.

Veelgemaakte fout: nul als mislukking zien

De uitdrukking int(text) or default lijkt op een korte terugvalregel, maar controleert de waarheid van de uitkomst. Een geldige nul is onwaar en wordt daardoor vervangen. Bovendien vangt deze uitdrukking een conversiefout helemaal niet af.

Houd daarom succes en mislukking uit elkaar met de echte foutafhandeling. return verlaat de functie vanuit zowel try als except; de aanroeper krijgt precies de waarde van de gekozen route. Een geprinte melding vervangt die retourwaarde niet.

Jouw herstelregels

Alle conversie-invoer in deze oefening is tekst. Gebruik de normale betekenis van int, inclusief witruimte, een minteken en nul; voeg geen eigen getalformaat toe. De deelopdracht voor deling krijgt getallen en vangt alleen delen door nul af.

AAN DE SLAG 0/4
1

Aantal of terugvalwaarde

Maak count_or(text, default): geef int(text) terug, of alleen bij ValueError de meegegeven default. Een geldige nul blijft nul.

2

Delen of terugvalwaarde

Maak quotient_or(total, divisor, default): geef total / divisor terug, of alleen bij ZeroDivisionError de default. Een negatieve deler is geldig.

3

Beide aantallen of geen paar

Maak read_pair(left, right): geef de tuple (int(left), int(right)) terug. Mislukt één van beide conversies met ValueError, geef dan None terug.

4

Verder na ongeldige invoer

Maak collect_counts(texts) die alle geldige int-conversies in een nieuwe lijst teruggeeft, in dezelfde volgorde. Sla uitsluitend tekst met ValueError over en verwerk daarna ook de volgende invoer.

Onthoud dit

  • try probeert een bewerking; een passende except geeft de herstelroute.
  • Na de fout worden de resterende regels van dat try overgeslagen.
  • Een geldige nul is een geslaagde uitkomst, geen reden voor een terugvalwaarde.

Hierna houd je onverwachte fouten zichtbaar en kies je de volgorde van handlers.

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.