Aantal of terugvalwaarde
Maak count_or(text, default): geef int(text) terug, of alleen bij ValueError de meegegeven default. Een geldige nul blijft nul.
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 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.
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.
for reading in ["18.5", "kapot", "0"]:
try:
value = float(reading)
print(value)
except ValueError:
print("Geen getal:", reading)
print("Verder")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.
try:
print(float("snel"))
except TypeError:
print("Verkeerd soort argument")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.
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.
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.
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.
Maak count_or(text, default): geef int(text) terug, of alleen bij ValueError de meegegeven default. Een geldige nul blijft nul.
Maak quotient_or(total, divisor, default): geef total / divisor terug, of alleen bij ZeroDivisionError de default. Een negatieve deler is geldig.
Maak read_pair(left, right): geef de tuple (int(left), int(right)) terug. Mislukt één van beide conversies met ValueError, geef dan None terug.
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.
try probeert een bewerking; een passende except geeft de herstelroute.try overgeslagen.Hierna houd je onverwachte fouten zichtbaar en kies je de volgorde van handlers.
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.