← Python/Foutafhandeling
Les 7 van 8
MODULE 06 · 07◷ 28 min

Fouten zichtbaar houden zonder gegevensverlies

Na deze les kun je
  • Een gewone fout vastleggen en hetzelfde object doorgeven.
  • Onderbrekingen onderscheiden van de categorie Exception.
  • Afgewezen invoer bewaren en fouten uit vervolgbewerkingen zichtbaar houden.

Een import meldt dat zij klaar is, maar een deel van de aantallen ontbreekt. Er verscheen geen fout omdat een brede handler alles heeft overgeslagen. Een herstelregel is pas bruikbaar wanneer duidelijk blijft wat er mislukte en wanneer doorgaan verantwoord is.

Zichtbaar maken is niet hetzelfde als herstellen

Sommige fouten wil je bij een grens vastleggen en daarna doorgeven. Zo'n logboek ondersteunt onderzoek; het is geen vervangende uitkomst voor de oorspronkelijke bewerking. De aanroeper kan dan nog steeds beslissen of het proces moet stoppen.

In het voorbeeld noteert een functie het fouttype en geeft zij dezelfde fout verder. De buitenste handler toont een melding. Kijk welke plaats informatie vastlegt en welke plaats de uiteindelijke reactie kiest.

type(error).__name__ levert de typenaam als tekst, zoals ValueError. Die naam is hier de informatie die het logboek bewaart.

Een logboek is geen herstelwaarde
audit = []

def read_level(text):
    try:
        return int(text)
    except ValueError as error:
        audit.append(type(error).__name__)
        raise

try:
    read_level("hoog")
except ValueError:
    print("De invoer is niet verwerkt")
print(audit)
Verwachte uitvoer
De invoer is niet verwerkt
['ValueError']

Een logregel bewijst niet dat het probleem is opgelost. Ook het aanmaken van een nieuw foutobject met hetzelfde bericht is geen ongewijzigde doorgave. Als je dezelfde fout verder wilt laten gaan, gebruik je de losstaande raise in de handler.

Niet elke onderbreking is een gewone fout

Je kent Exception als brede categorie voor gewone fouten. BaseException is nog breder: ook KeyboardInterrupt en SystemExit vallen eronder. Zij vallen niet onder Exception en drukken onder meer onderbreken en afsluiten uit.

Een kale except vangt ook die bredere categorie. Voor een gewoon logboek van bewerkingsfouten is dat meestal niet de bedoeling. In deze oefening leg je Exception vast; zulke onderbrekingen gaan zonder extra logregel verder.

De proef gebruikt vaste foutobjecten om die routes te laten zien. Je hoeft zelf geen toetsenbordonderbreking op te wekken of de uitvoeromgeving af te sluiten. Het gaat om de categorie die jouw handler wel of niet past.

Een verwacht probleem krijgt een afgesproken route

Een lijst met getaltekst mag onleesbare invoer bevatten wanneer het contract daar rekening mee houdt. Geef dan zowel de geldige aantallen als de afgewezen oorspronkelijke teksten terug. De aanroeper kan ontbrekende gegevens zo onderzoeken of laten corrigeren.

Bewaar ook de volgorde en herhaalde afwijzingen. " fout " is niet hetzelfde bewijs als "fout": de oorspronkelijke invoer laat zien welke tekst werkelijk is ontvangen. Nul en negatieve aantallen blijven hier normale resultaten van int.

Veelgemaakte fout: een bug wordt nul

Het volgende voorbeeld vangt iedere gewone fout af en geeft nul terug. De bewerking bevat echter een typefout, geen afgesproken lege invoer. Het keurige resultaat maakt die programmeerfout moeilijker te herkennen.

Een brede terugvalregel verbergt een typefout
def hidden_bug():
    try:
        return "2" + 3
    except Exception:
        return 0

print("Gemeld:", hidden_bug())
Verwachte uitvoer
Gemeld: 0

Een terugvalwaarde is alleen juist wanneer de betreffende fout bij het contract hoort. Daarom vangt recover_value uitsluitend ValueError af. Een verkeerde argumentsoort of een onderbreking wordt daardoor geen schijnbaar geldig getal.

Bewaak de grens in een verwerkingslus

Bij map_counts is een onleesbare tekst een verwachte afwijzing. Een fout in de meegegeven rekenfunctie is dat niet. Laat die functie buiten het try voor de conversie draaien, ook wanneer zij zelf een ValueError geeft.

Na zo'n onverwachte fout stopt de gewone verwerking. Ga niet ongemerkt verder met latere items en geef geen gedeeltelijk succesresultaat terug. Eerder uitgevoerde handelingen van een callback worden daarmee niet automatisch teruggedraaid; afhandeling en terugdraaien zijn verschillende onderwerpen.

Jouw informatie behouden

De opdrachten gebruiken een meegegeven audit-lijst of een aparte afwijzingslijst. Verander niet stiekem het fouttype, de oorspronkelijke invoertekst of de volgorde. Een nieuwe aanroep van de verzamelfunctie begint met nieuwe lijsten.

AAN DE SLAG 0/4
1

Vastleggen en ongewijzigd doorgaan

Maak run_logged(operation, audit): geef een geslaagde operation() terug. Voeg bij Exception de fouttypenaam toe aan dezelfde audit-lijst en geef hetzelfde foutobject door. KeyboardInterrupt gaat zonder logregel verder.

2

Alleen de afgesproken fout herstellen

Maak recover_value(operation, fallback): geef operation() terug en geef uitsluitend bij ValueError de fallback. Geldige nulwaarden blijven nul; TypeError en KeyboardInterrupt blijven hetzelfde foutobject.

3

Afwijzingen niet laten verdwijnen

Maak parse_many(lines): geef een tuple (geldige aantallen, afgewezen oorspronkelijke teksten) terug. Gebruik int; bewaar volgorde, herhalingen en originele afwijzingen. Maak bij elke aanroep nieuwe lijsten.

4

Een fout in de vervolgbewerking laten stoppen

Maak map_counts(lines, transform): sla tekst met een conversie-ValueError over en verzamel transform(number) voor de overige aantallen. Fouten uit transform, ook ValueError, gaan ongewijzigd verder; verwerk daarna geen volgend item.

Onthoud dit

  • Een logboek kan een fout vastleggen terwijl dezelfde fout verdergaat.
  • Vang alleen de categorie af waarvoor je een afgesproken reactie hebt.
  • Bewaar afwijzingen en verberg fouten uit een vervolgbewerking niet als invoerproblemen.

Hierna combineer je de herstelregels in een kleine, controleerbare invoerpijplijn.

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.