Python Error Handling: probeer / behalve / else / eindelijk in 2026
Bij foutafhandeling wordt een onderscheid gemaakt tussen 'code die op uw machine werkt' en 'code die de productie overleeft'. Python's try/except ziet er eenvoudig uit, maar de volledige vorm van vier trefwoorden — try/except/else/final — codeert voor een verrassende hoeveelheid structuur die de meeste tutorials overslaan.
Deze gids behandelt: wat elk trefwoord eigenlijk betekent, de zes patronen die u in elke backend-codebase zult zien, wanneer u uw eigen uitzonderingen moet definiëren, en de drie antipatronen die ervoor zorgen dat bugs aan uw tests voorbijglippen.
De vier trefwoorden, precies
De 'else'-clausule wordt te weinig gebruikt. Er staat: "Dit volgende stukje hangt af van de succesvolle poging, maar ik wil niet dat het door dezelfde wordt beschermd, behalve". Het is de juiste plaats voor de happy path continuation — als je het in try plaatst, worden per ongeluk niet-gerelateerde uitzonderingen uit ship(result) onderschept.
De zes patronen
1. Probeer het opnieuw bij een tijdelijke fout
Regel: ALLEEN opnieuw proberen bij tijdelijke fouten (netwerk, time-out, 429, 503). Probeer nooit opnieuw ValueError, KeyError, TypeError — dat zijn codefouten, en als u het opnieuw probeert, wordt de fout slechts drie keer uitgevoerd.
2. Bewaak met anders
De else garandeert dat bestand succesvol is geopend EN dat de scope wordt opgeschoond met with. Let op: process() kan ValueError oproepen — dat zal zich voortplanten en NIET worden opgevangen door behalve FileNotFoundError.
3. Opschonen met eindelijk (voordat with bestond)
In moderne code zou je with db.connect() gebruiken als conn: — with is de suiker boven try / eindelijk voor het gebruikelijke opruimgeval. Reik alleen naar expliciet 'eindelijk' als de bron het contextmanagerprotocol niet ondersteunt.
4. Re-raise met toegevoegde context
raise NewException(...) from e koppelt de oorspronkelijke uitzondering aan de nieuwe, zodat de traceback BEIDE toont. Schrijf nooit raise NewException(str(e)) — dat verwijdert de originele traceback.
5. Vang de kleinste uitzondering die je kunt
Regel: hoe smaller de uitzondering, hoe beter. Als je niet weet wat 'proces' kan opleveren, voer het dan uit en ontdek het. behalve Exception: is 90% van de tijd een codegeur.
6. raise binnen behalve — re-raise netjes
Door de kale ‘raise’ blijft de originele traceback intact. Nooit 'raise e' (Python 3 is er slim in, maar 'raise' is de idiomatische vorm).
Aangepaste uitzonderingen — als het de moeite waard is
Definieer uw eigen uitzonderingsklasse wanneer:
1. Bellers moeten specifiek 'Behalve MyError:' gebruiken (dat wil zeggen, u heeft een aanroepbare API en gebruikers moeten vertakken op fouttype).
2. Uw bibliotheek/service geeft aanleiding tot meerdere gerelateerde fouten die dezelfde context hebben.
Bellers kunnen nu breed (behalve PaymentError) of nauw (behalve CardDeclinedError) ontvangen. Gestructureerde attributen op de uitzondering (e.card_last4) zorgen ervoor dat foutafhandelaars nuttige UX kunnen bouwen zonder uitzonderingsberichten te parseren.
Anti-patroon: definieert een aangepaste uitzondering die slechts één keer kan worden gegenereerd en nooit kan worden opgevangen. Dat is gewoon raise ValueError("..."). Aangepaste uitzonderingen verdienen hun gewicht doordat ze betrapt worden.
Drie antipatronen die bugs verbergen
Antipatroon 1: Kaal behalve
Bare except vangt signalen op die het programma zouden moeten afsluiten (Ctrl-C, sys.exit, MemoryError). Schrijf dit nooit. Als je echt elke niet-fatale uitzondering wilt onderscheppen, gebruik dan except Exception: — die NOG STEEDS te veel opvangt, maar in ieder geval Ctrl-C respecteert.
Antipatroon 2: Stilzetten zonder inloggen
Elke gevangen uitzondering moet worden afgehandeld (met een specifieke fallback) of worden vastgelegd. pass in anexcept is een bug in slow motion - de code lijkt te werken terwijl gegevens stilletjes worden weggegooid.
Antipatroon 3: behalve Uitzondering: rond alles
Probleem: als stripe.charge slaagde maar send_receipt mislukte, werden er kosten aan de klant in rekening gebracht EN heeft u de fout ingeslikt. Het 'behalve' omvat vier verschillende foutmodi, en je kunt ze niet van elkaar onderscheiden.
Opgelost: verklein de try-scope + vertak de uitzonderingen op modulegrens.
Elke poging omvat EEN operatie. Iedereen behalve weet wat te doen aan DEZE specifieke storing. Dat is foutafhandeling op productieniveau.
Goede foutafhandeling is meer ontwerp dan syntaxis. proberen / behalve / anders / eindelijk geeft je de tools; de discipline is het juiste type kiezen, de kleinst mogelijke reikwijdte van de poging, en nooit fouten uitsluiten die je niet begrijpt.
Volgende stap: de Foundations track bevat 10 lessen over het omgaan met uitzonderingen, aangepaste uitzonderingen en de with-instructie — waarbij echte Python in uw browser wordt uitgevoerd.