Fouten en exceptions kunnen leiden tot programmacrashes of onverwacht gedrag, en Python heeft een robuuste set tools om de stabiliteit van je code te verbeteren.
Fouten en exceptions kunnen leiden tot onverwacht gedrag of zelfs het stoppen van een programma. Python biedt diverse functies en mechanismen om deze problemen af te handelen en de robuustheid van je code te verbeteren. In deze tutorial leren we over verschillende fouttypen en ingebouwde functies met voorbeelden.
Een fout is een kritiek probleem in code waarvan je tijdens runtime meestal niet kunt herstellen, zoals onjuiste syntax of verkeerde inspringing.
Een exception is een runtime-gebeurtenis die de normale programmastroom verstoort maar kan worden opgevangen en afgehandeld, zodat het programma kan doorgaan.
Hoewel exceptions tijdens runtime optreden, worden sommige fouten zoals SyntaxError en IndentationError al door de parser opgevangen voordat het programma überhaupt draait.
Simpel gezegd: een fout is een kritisch probleem dat een normale applicatie niet zou moeten opvangen, terwijl een exception een conditie is die een programma wél zou moeten opvangen.
Laten we meer leren over fouten en exceptions aan de hand van verschillende voorbeelden. Om ze makkelijk te draaien, kun je gratis een DataLab-werkboek aanmaken met Python vooraf geïnstalleerd en alle codevoorbeelden erbij.
Fouten in Python
Hier is een voorbeeld van een syntaxfout waarbij een return buiten de functie niets betekent. We zouden fouten niet in een programma moeten afhandelen. In plaats daarvan moeten we een functie maken die de string retourneert.
Input In [1]return"DataCamp"^
SyntaxError:'return' outside function
Mogelijk gemaakt door
We hebben de functie gemaakt, maar met de verkeerde inspringing. We zouden inspringfouten niet tijdens runtime moeten afhandelen. Dit lossen we handmatig op of met codeformatteertools.
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
Input In [4],in<cell line:1>()---->1 test =1/0
ZeroDivisionError: division by zeroMogelijk gemaakt door
NameError-exceptions komen vaak voor wanneer een variabele niet wordt gevonden. We kunnen de exception ook afhandelen door de variabele te vervangen of een waarschuwing te printen.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Input In [5],in<cell line:1>()---->1 y = test
NameError
Mogelijk gemaakt door
Ingebouwde Python-exceptions
Hier is de lijst met standaard Python-exceptions met beschrijvingen:
AssertionError: wordt opgegooid wanneer de assert-instructie faalt.
EOFError: wordt opgegooid wanneer de input()-functie het einde-van-bestand bereikt.
AttributeError: wordt opgegooid wanneer het toewijzen of refereren van een attribuut faalt.
TabError: wordt opgegooid wanneer inspringing uit inconsistente tabs of spaties bestaat.
ImportError: wordt opgegooid wanneer het importeren van een module faalt.
IndexError: treedt op wanneer de index van een sequentie buiten bereik is
KeyboardInterrupt: wordt opgegooid wanneer de gebruiker interrupt-toetsen invoert (Ctrl + C of Delete).
RuntimeError: treedt op wanneer een fout in geen enkele andere categorie valt.
NameError: wordt opgegooid wanneer een variabele niet in de lokale of globale scope wordt gevonden.
MemoryError: wordt opgegooid wanneer programma's te weinig geheugen hebben.
ValueError: treedt op wanneer een bewerking of functie een argument met het juiste type maar de verkeerde waarde krijgt.
ZeroDivisionError: wordt opgegooid wanneer je een waarde of variabele door nul deelt.
SyntaxError: wordt door de parser opgegooid wanneer de Python-syntax onjuist is.
IndentationError: treedt op bij onjuiste inspringing.
SystemError: wordt opgegooid wanneer de interpreter een interne fout detecteert.
Je vindt een volledige lijst met fouten en exceptions in Python in de documentatie.
Leer over Python-exceptions in onze cursus Object-Oriented Programming in Python. Je leert hoe je classes maakt en gebruikmaakt van overerving en polymorfisme om code te hergebruiken en te optimaliseren.
Exception handling met try, except, else en finally
Nu we over fouten en exceptions hebben geleerd, gaan we ze afhandelen met try-, except-, else- en finally-blokken.
Wat bedoelen we met afhandelen? Normaal gesproken stoppen deze fouten de code-executie en tonen ze het foutbericht. Om stabiele systemen te bouwen, moeten we deze fouten voorzien en met alternatieve oplossingen of waarschuwingen komen.
In deze sectie leren we wat elk blok doet en hoe we ze kunnen gebruiken om robuuste code te schrijven.
De try- en except-instructie
De eenvoudigste manier om exceptions in Python af te handelen is met het try- en except-blok.
Voer de code uit onder de try-instructie.
Wanneer er een exception wordt opgegooid, voer de code uit onder de except-instructie.
In plaats van te stoppen bij een fout of exception, gaat onze code door met alternatieve oplossingen.
Eenvoudig voorbeeld
In het eerste voorbeeld proberen we de ongedefinieerde variabele x te printen. Normaal zou dat een fout opleveren en de uitvoering stoppen, maar met het try- en except-blok kunnen we de stroom veranderen.
Het programma voert de code onder de try-instructie uit.
Omdat we weten dat x niet is gedefinieerd, wordt de except-instructie uitgevoerd en de waarschuwing geprint.
In het tweede voorbeeld gebruiken we meerdere except-instructies om meerdere typen exceptions af te handelen.
Als een ZeroDivisionError-exception wordt opgegooid, print het programma "You cannot divide a value with zero."
De rest van de exceptions printen “Something else went wrong.”
Dit stelt ons in staat flexibele code te schrijven die meerdere exceptions tegelijk aankan zonder te crashen.
Let op: Vermijd een kale except:-clausule zonder specifiek exceptietype — die vangt alles, inclusief KeyboardInterrupt en SystemExit, wat je programma onmogelijk kan maken om af te sluiten en niet-gerelateerde bugs kan verbergen. Vang altijd de specifieke exception die je verwacht, zoals except ZeroDivisionError:.
try:print(1/0)except ZeroDivisionError:print("You cannot divide a value with zero")except:print("Something else went wrong")Mogelijk gemaakt door
In de code hieronder lezen we het CSV-bestand, en wanneer FileNotFoundError wordt opgegooid, print de code de fout en een extra bericht over het data.csv-bestand.
Ja, we kunnen standaardfoutmeldingen printen zonder de uitvoering te onderbreken.
try:withopen('data.csv')asfile:
read_data =file.read()except FileNotFoundError as fnf_error:print(fnf_error)print("Explanation: We cannot load the 'data.csv' file")Mogelijk gemaakt door
[Errno 2] No such fileor directory:'data.csv'
Explanation: We cannot load the 'data.csv'fileMogelijk gemaakt door
try met else-clausule
We hebben try en except behandeld, en nu leren we over de else-instructie.
Wanneer de try-instructie geen exception oplevert, gaat de code het else-blok in. Het is het middel of de fallback wanneer je verwacht dat een deel van je script een exception kan geven. Het wordt meestal gebruikt in een korte setup- of verificatiesectie waar je bepaalde fouten niet verborgen wilt laten raken.
Let op: In het try-except-blok gebruik je else na alle except-instructies.
Eenvoudig voorbeeld
We voegen de else-instructie toe aan het ZeroDivisionError-voorbeeld. Zoals je ziet wordt, wanneer er geen exceptions zijn, de print-functie onder de else-instructie uitgevoerd en het resultaat getoond.
try:
result =1/3except ZeroDivisionError as err:print(err)else:print(f"Your answer is {result}")Mogelijk gemaakt door
Laten we verder leren door een eenvoudige functie te maken en die in verschillende scenario's te testen.
De functie find_nth_value() heeft x (lijst) en n (indexnummer) als argumenten. We hebben een try-, except- en else-blok gemaakt om de IndexError-exception af te handelen.
x =[5,8,9,13]deffind_nth_value(x,n):try:
result = x[n]except IndexError as err:print(err)else:print("Your answer is ", result)Mogelijk gemaakt door
De lijst x heeft vier waarden, en we testen de 6e en 2e index.
Het keyword finally in het try-except-blok wordt altijd uitgevoerd, ongeacht of er wel of geen exception is. Het finally-blok voert altijd uit na try, except en else, ongeacht of een exception is opgegooid of opgevangen. Het is erg handig voor het opruimen van resources en het sluiten van objecten, vooral bestanden sluiten.
De functie divide is gemaakt om ZeroDivisionError-exceptions af te handelen en het resultaat te tonen wanneer er geen exceptions zijn. Wat de uitkomst ook is, finally draait altijd om “Code by DataCamp” in groene kleur te printen.
defdivide(x,y):try:
result = x/y
except ZeroDivisionError:print("Please change 'y' argument to non-zero value")except:print("Something went wrong")else:print(f"Your answer is {result}")finally:print("\033[92m Code by DataCamp\033[00m")Mogelijk gemaakt door
In de eerste test delen we 1 door 0, wat de ZeroDivisionError-exception zou moeten opleveren en het bericht printen. Zoals je ziet, staat er een extra regel na het foutbericht.
In plaats van een integer hebben we een string als tweede argument toegevoegd, wat een andere exception dan ZeroDivisionError opleverde met een ander bericht.
In alle drie scenario’s is er één overeenkomst: de code draait altijd de printfunctie onder de finally-instructie.
Ben je nieuw in Python en wil je coderen als een echte programmeur? Probeer dan ons Python Programming skill track. Je leert efficiënte code schrijven, Python-functies, software engineering, unit testing en objectgeoriënteerd programmeren.
Geneste exception handling in Python
We hebben geneste exception handling nodig wanneer we het programma voorbereiden om meerdere exceptions na elkaar af te handelen. We kunnen bijvoorbeeld een extra try-except-blok toevoegen onder de else-instructie. Dus als de eerste instructie geen exception oplevert, controleer dan de tweede instructie met de rest van de code.
De divide-functie aanpassen
We hebben de divide-functie uit het vorige voorbeeld aangepast en een genest try-except-blok toegevoegd onder de else-instructie. Als er dus geen AttributeError is, draait else en controleert de nieuwe code op de ZeroDivisionError-exception.
defdivide(x,y):try:
value =50
x.append(value)except AttributeError as atr_err:print(atr_err)else:try:
result =[i / y for i in x]print( result )except ZeroDivisionError:print("Please change 'y' argument to non-zero value")finally:print("\033[92m Code by DataCamp\033[00m")Mogelijk gemaakt door
In het eerste scenario geven we de lijst met vier waarden x en noemer 3. Het script voegt 50 toe aan de lijst, deelt elke waarde in de lijst door 3 en toont het resultaat.
In het laatste scenario hebben we de lijst opgegeven, maar is 0 het tweede argument, wat de ZeroDivisionError-exception onder de else-instructie heeft opgeworpen.
Bekijk meer praktische voorbeelden van een bestand laden, tekst schrijven en het bestand sluiten.
De functie file_editor() zal:
De FileNotFoundError-exception controleren voor de open()-functie.
Als de buitenste exception niet wordt opgegooid, controleren op de exception van de write()-functie.
Hoe dan ook, na het openen van het bestand, het bestand sluiten via de finally-instructie.
Als de buitenste try-instructie de exception opwerpt, de foutmelding met een ongeldig bestandspad retourneren.
deffile_editor(path,text):try:
data =open(path)try:
data.write(text)except:print("Unable to write the data. Please add an append: 'a' or write: 'w' parameter to the open() function.")finally:
data.close()except:print(f"{path} file is not found!!")Mogelijk gemaakt door
In het eerste scenario geven we het bestandspad en de tekst op.
path ="data.txt"
text ="DataLab: Share your data analysis in a cloud-based environment--no installation required."
file_editor(path,text)Mogelijk gemaakt door
De binnenste exception wordt opgegooid, omdat de write()-functie de tekst niet kan toevoegen.
Unable to write the data. Please add an append:'a'or write:'w' parameter to the open() function.Mogelijk gemaakt door
Om dit op te lossen, moeten we de derde regel wijzigen van data = open(path) naar data = open(path, 'a'). Hiermee kunnen we de nieuwe tekst aan het bestand toevoegen.
Na het opnieuw uitvoeren van de functie hebben we de tekst succesvol aan het bestand toegevoegd.
Geneste exception handling wordt niet aanbevolen omdat het de afhandeling complexer maakt; ontwikkelaars gebruiken meerdere try-except-blokken om eenvoudige sequentiële exception handling te maken.
Let op: je kunt ook een genest try-except-blok onder de try- of except-instructie toevoegen. Het hangt gewoon af van je vereisten.
Exceptions opwerpen (raise) in Python
Naast het opvangen van exceptions kun je ze bewust opwerpen met het keyword raise. Dit is nuttig om bedrijfsregels af te dwingen of invoer te valideren. Het geeft een signaal dat er iets mis is voordat het verderop voor een lastigere fout zorgt.
Om een exception op te werpen, gebruiken we het keyword raise gevolgd door een exceptionnaam.
Voorbeeld ValueError opwerpen
We kunnen eenvoudig exceptions opwerpen door een raise-keyword toe te voegen in de if/else-instructie.
In het voorbeeld werpen we ValueError op als de waarde groter is dan 1.000. We hebben de waarde naar 2.000 gezet, waardoor de if-instructie TRUE werd en ValueError met het aangepaste bericht werd opgegooid. Het aangepaste foutbericht helpt je het probleem snel te vinden.
value =2_000if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Mogelijk gemaakt door
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)---->4raise ValueError("Please add a value lower than 1,000")5else:6print("Congratulations! You are the winner!!")
ValueError: Please add a value lower than 1,000Mogelijk gemaakt door
Voorbeeld exception opwerpen
We kunnen ook een willekeurige ingebouwde Python-exception opwerpen als aan de conditie is voldaan. In ons geval hebben we een generieke Exception met het foutbericht opgegooid.
if value >1_000:# raise the Exceptionraise Exception("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")Mogelijk gemaakt door
---------------------------------------------------------------------------
Exception Traceback (most recent call last)---->3raise Exception("Please add a value lower than 1,000")4else:5print("Congratulations! You are the winner!!")
Exception: Please add a value lower than 1,000Mogelijk gemaakt door
Voorbeeld opgegooide exception afhandelen
We kunnen ook een eigen exception maken en die afhandelen met het try-except-blok.
In het voorbeeld hebben we een value error-voorbeeld onder de try-instructie toegevoegd.
Hoe werkt dit? In plaats van de exception te gooien en het programma te beëindigen, toont het het door ons opgegeven foutbericht.
value =2_000try:if value >1_000:# raise the ValueErrorraise ValueError("Please add a value lower than 1,000")else:print("Congratulations! You are the winner!!")# if false then raise the value errorexcept ValueError as e:print(e)Mogelijk gemaakt door
Dit type exception handling helpt ons ons voor te bereiden op fouten die niet door Python worden gedekt en specifiek zijn voor jouw applicatievereisten.
Naast losse exceptions opwerpen kun je exceptions ketenen met raise ... from. Dit bewaart de oorspronkelijke exception als context, waardoor tracebacks veel duidelijker worden wanneer de ene fout door een andere wordt veroorzaakt.
try:open("config.json")except FileNotFoundError as e:raise RuntimeError("App failed to start: config file missing")from eMogelijk gemaakt door
FileNotFoundError:[Errno 2] No such fileor directory:'config.json'
The above exception was the direct cause of the following exception:
RuntimeError: App failed to start: config file missingMogelijk gemaakt door
Het deel from e zet het attribuut __cause__ op de nieuwe exception, zodat iedereen die de traceback leest precies kan zien wat deze triggerde. Dit is vooral nuttig in grotere applicaties waar exceptions door meerdere lagen code gaan.
Wat is er nieuw in Python 3.10 - 3.13 voor exception handling?
Sinds dit blogbericht oorspronkelijk is geschreven, zijn er in nieuwere Python-versies zoals 3.10 en 3.11 belangrijke ontwikkelingen bijgekomen:
1. Structurele pattern matching in Python 3.10
Python 3.10 introduceerde structurele pattern matching, dat kan worden gebruikt om exceptions eleganter af te handelen door fouttypen in een match-instructie te matchen. Dit is vooral handig bij het afhandelen van meerdere exceptietypen op een beter leesbare manier. Voorbeeld:
try:
result =1/0except Exception as e:match e:case ZeroDivisionError():print("You cannot divide by zero.")case NameError():print("Variable not defined.")case_:print("An unexpected error occurred.")Mogelijk gemaakt door
2. Fijnmazige foutlocaties in tracebacks (Python 3.11)
Tracebacks in Python 3.11 tonen nu precieze foutlocaties, waardoor exceptions makkelijker te debuggen zijn.
Python 3.11 introduceerde exceptiongroepen om meerdere exceptions in één blok af te handelen met except*. Dit is nuttig voor het beheren van asynchrone code of scenario's waarin meerdere exceptions kunnen worden opgegooid. Voorbeeld:
try:raise ExceptionGroup("Multiple errors",[ValueError("Bad value"), TypeError("Bad type")])except* ValueError as ve:print(f"Handling ValueError: {ve}")except* TypeError as te:print(f"Handling TypeError: {te}")Mogelijk gemaakt door
4. add_note-methode voor exceptions (Python 3.11)
Exceptions hebben nu een add_note()-methode, waarmee ontwikkelaars aangepaste notities aan exceptions kunnen toevoegen voor betere debugging. Voorbeeld:
try:raise ValueError("Invalid input")except ValueError as e:
e.add_note("This happened while processing user input.")
e.add_note("Consider validating input before processing.")raiseMogelijk gemaakt door
ValueError: Invalid input
Notes:- This happened while processing user input.- Consider validating input before processing.Mogelijk gemaakt door
5. PEP 654: Betere afhandeling van geneste exceptions
Met exceptiongroepen zijn geneste exceptions nu makkelijker te debuggen en af te handelen, vooral in complexe workflows zoals multiprocessing of asynchrone taken.
6. Verbeterde foutmeldingen (Python 3.12)
Python 3.12 zette een langlopende inspanning voort om foutmeldingen specifieker en bruikbaarder te maken. Zo suggereren NameError-meldingen nu gelijkende variabelen die in scope zijn, en geven attribute errors op veelvoorkomende types gerichtere hints:
AttributeError:'list'object has no attribute 'appendd'. Did you mean:'append'?Mogelijk gemaakt door
7. Gekleurde tracebacks (Python 3.13)
Python 3.13 introduceerde standaard gekleurde tracebacks in de interactieve interpreter. Fouttypen, regelnummers en berichten worden nu in verschillende kleuren gemarkeerd, waardoor je veel sneller kunt scannen en begrijpen wat er misging — vooral in lange tracebacks met meerdere gekoppelde exceptions.
Conclusie
Zowel unit testing als exception handling zijn kerndelen van Python-programmeren die je code productieklaar en foutbestendig maken. In deze tutorial hebben we geleerd over exceptions en fouten in Python en hoe je ze afhandelt. Verder hebben we complexe geneste try-except-blokken behandeld en aangepaste exceptionblokken gemaakt op basis van vereisten.
Deze tools en mechanismen zijn essentieel, maar het meeste werk wordt gedaan met eenvoudige try- en except-blokken. Waar try zoekt naar exceptions die door de code worden opgegooid en except die exceptions afhandelt.
Vind je dit verwarrend en weet je niet waar je moet beginnen? Volg dan onze cursus Introduction to Functions in Python om scoping, lambda-functies en foutafhandeling te begrijpen. Je kunt je ook inschrijven voor de Python Programmer career track om carrièrebepalende skills op te doen en een professionele Python-ontwikkelaar te worden.
Als gecertificeerd data scientist haal ik met passie het maximale uit de nieuwste technologie om innovatieve machinelearning-toepassingen te bouwen. Met een sterke achtergrond in spraakherkenning, data-analyse en -rapportage, MLOps, conversationele AI en NLP heb ik mijn vaardigheden aangescherpt in het ontwikkelen van intelligente systemen die echt impact maken. Naast mijn technische expertise ben ik ook een sterke communicator met een talent om complexe concepten terug te brengen tot heldere, beknopte taal. Daardoor ben ik uitgegroeid tot een veelgelezen blogger over data science, waar ik mijn inzichten en ervaringen deel met een groeiende community van data-professionals. Op dit moment richt ik me op contentcreatie en redactie, waarbij ik met large language models werk aan krachtige en aansprekende content die zowel bedrijven als individuen helpt het beste uit hun data te halen.
FAQs
Wat is het verschil tussen een fout en een exception in Python?⌄
Een fout in Python is doorgaans een ernstiger probleem dat voorkomt dat het programma doorgaat, zoals een syntaxfout, wat aangeeft dat de codestructuur onjuist is. Een exception daarentegen is een conditie die de normale programmastroom onderbreekt maar binnen het programma kan worden afgehandeld met try-except-blokken, zodat het programma kan blijven draaien.
Kun je meerdere exceptions in één try-except-blok opvangen?⌄
Ja, in Python kun je meerdere exceptions in één try-except-blok opvangen door een tuple met exceptietypen te gebruiken. Bijvoorbeeld: except (TypeError, ValueError):. Dit handelt zowel een TypeError als een ValueError in hetzelfde blok af.
Hoe maak je een custom exception in Python?⌄
Je kunt een custom exception maken door een nieuwe class te definiëren die erft van de ingebouwde Exception-class. Bijvoorbeeld:
Wat is het doel van het else-blok in een try-except-structuur?⌄
Het else-blok wordt uitgevoerd als het try-blok geen exception opwerpt. Het is handig voor code die alleen moet draaien als het try-blok slaagt, zodat de code schoon blijft en foutafhandeling gescheiden is van het normale pad.
Waarom is het finally-blok belangrijk bij exception handling?⌄
Het finally-blok wordt altijd uitgevoerd, ongeacht of er een exception wordt opgegooid. Het wordt meestal gebruikt voor opruimacties, zoals bestanden sluiten of resources vrijgeven, om te garanderen dat deze acties altijd plaatsvinden.
Hoe kun je exceptions onderdrukken in Python?⌄
Je kunt exceptions onderdrukken met de contextlib.suppress-contextmanager. Daarmee kun je exceptietypen opgeven die genegeerd moeten worden. Bijvoorbeeld:
from contextlib import suppress
with suppress(FileNotFoundError):open('non_existent_file.txt')Mogelijk gemaakt door
Wat gebeurt er als een exception niet wordt opgevangen in een Python-programma?⌄
Als een exception niet wordt opgevangen, propageren ze omhoog in de call stack, en als ze onafgehandeld blijven, beëindigen ze het programma. Er wordt dan een traceback naar de console geprint die laat zien waar de exception optrad.
Kun je een exception opnieuw opwerpen nadat je die hebt opgevangen?⌄
Ja, je kunt een exception opnieuw opwerpen met de raise-instructie zonder argumenten in een except-blok. Dit is handig wanneer je een fout wilt loggen of iets anders wilt doen voordat je de exception verder laat propagëren.
Is er een manier om alle exceptions in Python af te handelen?⌄
Hoewel je alle exceptions kunt opvangen met een kale except:-clausule, is dat doorgaans niet aan te raden omdat je onverwachte exceptions kunt opvangen en debuggen moeilijker wordt. Vang liever specifieke exceptions of gebruik except Exception: om te voorkomen dat systeembeëindigende exceptions zoals SystemExit en KeyboardInterrupt.
Hoe onderscheid je een syntaxfout en runtime-exceptions qua moment van optreden?⌄
Syntaxfouten worden gedetecteerd tijdens het compileren: de Python-interpreter vangt deze fouten voordat het programma wordt uitgevoerd. Runtime-exceptions treden op tijdens de uitvoering wanneer de interpreter een bewerking tegenkomt die hij niet kan uitvoeren, zoals delen door nul of een niet-bestaande variabele benaderen.
Fouten en exceptions kunnen leiden tot onverwacht gedrag of zelfs het stoppen van een programma. Python biedt diverse functies en mechanismen om deze problemen af te handelen en de robuustheid van je code te verbeteren. In deze tutorial leren we over verschillende fouttypen en ingebouwde functies met voorbeelden.
Hoewel exceptions tijdens runtime optreden, worden sommige fouten zoals
SyntaxErrorenIndentationErroral door de parser opgevangen voordat het programma überhaupt draait.Simpel gezegd: een fout is een kritisch probleem dat een normale applicatie niet zou moeten opvangen, terwijl een exception een conditie is die een programma wél zou moeten opvangen.
Laten we meer leren over fouten en exceptions aan de hand van verschillende voorbeelden. Om ze makkelijk te draaien, kun je gratis een DataLab-werkboek aanmaken met Python vooraf geïnstalleerd en alle codevoorbeelden erbij.
Fouten in Python
Hier is een voorbeeld van een syntaxfout waarbij een return buiten de functie niets betekent. We zouden fouten niet in een programma moeten afhandelen. In plaats daarvan moeten we een functie maken die de string retourneert.
We hebben de functie gemaakt, maar met de verkeerde inspringing. We zouden inspringfouten niet tijdens runtime moeten afhandelen. Dit lossen we handmatig op of met codeformatteertools.
Exceptions in Python
We kregen een
ZeroDivisionError(Exception). We kunnen die tijdens runtime afhandelen mettry- enexcept-blokken.NameError-exceptions komen vaak voor wanneer een variabele niet wordt gevonden. We kunnen de exception ook afhandelen door de variabele te vervangen of een waarschuwing te printen.Ingebouwde Python-exceptions
Hier is de lijst met standaard Python-exceptions met beschrijvingen:
AssertionError: wordt opgegooid wanneer de assert-instructie faalt.EOFError: wordt opgegooid wanneer deinput()-functie het einde-van-bestand bereikt.AttributeError: wordt opgegooid wanneer het toewijzen of refereren van een attribuut faalt.TabError: wordt opgegooid wanneer inspringing uit inconsistente tabs of spaties bestaat.ImportError: wordt opgegooid wanneer het importeren van een module faalt.IndexError: treedt op wanneer de index van een sequentie buiten bereik isKeyboardInterrupt: wordt opgegooid wanneer de gebruiker interrupt-toetsen invoert (Ctrl + C of Delete).RuntimeError: treedt op wanneer een fout in geen enkele andere categorie valt.NameError: wordt opgegooid wanneer een variabele niet in de lokale of globale scope wordt gevonden.MemoryError: wordt opgegooid wanneer programma's te weinig geheugen hebben.ValueError: treedt op wanneer een bewerking of functie een argument met het juiste type maar de verkeerde waarde krijgt.ZeroDivisionError: wordt opgegooid wanneer je een waarde of variabele door nul deelt.SyntaxError: wordt door de parser opgegooid wanneer de Python-syntax onjuist is.IndentationError: treedt op bij onjuiste inspringing.SystemError: wordt opgegooid wanneer de interpreter een interne fout detecteert.Je vindt een volledige lijst met fouten en exceptions in Python in de documentatie.
Leer over Python-exceptions in onze cursus Object-Oriented Programming in Python. Je leert hoe je classes maakt en gebruikmaakt van overerving en polymorfisme om code te hergebruiken en te optimaliseren.
Exception handling met try, except, else en finally
Nu we over fouten en exceptions hebben geleerd, gaan we ze afhandelen met
try-,except-,else- enfinally-blokken.Wat bedoelen we met afhandelen? Normaal gesproken stoppen deze fouten de code-executie en tonen ze het foutbericht. Om stabiele systemen te bouwen, moeten we deze fouten voorzien en met alternatieve oplossingen of waarschuwingen komen.
In deze sectie leren we wat elk blok doet en hoe we ze kunnen gebruiken om robuuste code te schrijven.
De try- en except-instructie
De eenvoudigste manier om exceptions in Python af te handelen is met het
try- enexcept-blok.Voer de code uit onder de
try-instructie.Wanneer er een exception wordt opgegooid, voer de code uit onder de
except-instructie.In plaats van te stoppen bij een fout of exception, gaat onze code door met alternatieve oplossingen.
Eenvoudig voorbeeld
In het eerste voorbeeld proberen we de ongedefinieerde variabele
xte printen. Normaal zou dat een fout opleveren en de uitvoering stoppen, maar met hettry- enexcept-blok kunnen we de stroom veranderen.try-instructie uit.xniet is gedefinieerd, wordt de except-instructie uitgevoerd en de waarschuwing geprint.Voorbeeld met meerdere except-instructies
In het tweede voorbeeld gebruiken we meerdere
except-instructies om meerdere typen exceptions af te handelen.ZeroDivisionError-exception wordt opgegooid, print het programma "You cannot divide a value with zero."Dit stelt ons in staat flexibele code te schrijven die meerdere exceptions tegelijk aankan zonder te crashen.
Let op: Vermijd een kale
except:-clausule zonder specifiek exceptietype — die vangt alles, inclusiefKeyboardInterruptenSystemExit, wat je programma onmogelijk kan maken om af te sluiten en niet-gerelateerde bugs kan verbergen. Vang altijd de specifieke exception die je verwacht, zoalsexcept ZeroDivisionError:.Bestand laden-voorbeeld
Kijk nu naar een praktischer voorbeeld.
In de code hieronder lezen we het CSV-bestand, en wanneer
FileNotFoundErrorwordt opgegooid, print de code de fout en een extra bericht over hetdata.csv-bestand.Ja, we kunnen standaardfoutmeldingen printen zonder de uitvoering te onderbreken.
try met else-clausule
We hebben
tryenexceptbehandeld, en nu leren we over deelse-instructie.Wanneer de
try-instructie geen exception oplevert, gaat de code hetelse-blok in. Het is het middel of de fallback wanneer je verwacht dat een deel van je script een exception kan geven. Het wordt meestal gebruikt in een korte setup- of verificatiesectie waar je bepaalde fouten niet verborgen wilt laten raken.Let op: In het try-except-blok gebruik je
elsena alleexcept-instructies.Eenvoudig voorbeeld
We voegen de
else-instructie toe aan hetZeroDivisionError-voorbeeld. Zoals je ziet wordt, wanneer er geen exceptions zijn, de print-functie onder deelse-instructie uitgevoerd en het resultaat getoond.IndexError met else-voorbeeld
Laten we verder leren door een eenvoudige functie te maken en die in verschillende scenario's te testen.
De functie
find_nth_value()heeftx(lijst) enn(indexnummer) als argumenten. We hebben eentry-,except- enelse-blok gemaakt om deIndexError-exception af te handelen.De lijst
xheeft vier waarden, en we testen de 6e en 2e index.IndexError-exception opgegooid en kregen we de standaardmelding “list index out of range”.else-instructie.Het keyword finally in Python
Het keyword
finallyin hettry-except-blok wordt altijd uitgevoerd, ongeacht of er wel of geen exception is. Hetfinally-blok voert altijd uit natry,exceptenelse, ongeacht of een exception is opgegooid of opgevangen. Het is erg handig voor het opruimen van resources en het sluiten van objecten, vooral bestanden sluiten.De functie
divideis gemaakt omZeroDivisionError-exceptions af te handelen en het resultaat te tonen wanneer er geen exceptions zijn. Wat de uitkomst ook is,finallydraait altijd om “Code by DataCamp” in groene kleur te printen.In de eerste test delen we 1 door 0, wat de
ZeroDivisionError-exception zou moeten opleveren en het bericht printen. Zoals je ziet, staat er een extra regel na het foutbericht.Als we geldige input toevoegen, wordt het resultaat getoond door uitvoering van de
else- enfinally-blokken.In plaats van een integer hebben we een string als tweede argument toegevoegd, wat een andere exception dan
ZeroDivisionErroropleverde met een ander bericht.In alle drie scenario’s is er één overeenkomst: de code draait altijd de printfunctie onder de
finally-instructie.Ben je nieuw in Python en wil je coderen als een echte programmeur? Probeer dan ons Python Programming skill track. Je leert efficiënte code schrijven, Python-functies, software engineering, unit testing en objectgeoriënteerd programmeren.
Geneste exception handling in Python
We hebben geneste exception handling nodig wanneer we het programma voorbereiden om meerdere exceptions na elkaar af te handelen. We kunnen bijvoorbeeld een extra try-except-blok toevoegen onder de
else-instructie. Dus als de eerste instructie geen exception oplevert, controleer dan de tweede instructie met de rest van de code.De divide-functie aanpassen
We hebben de
divide-functie uit het vorige voorbeeld aangepast en een genest try-except-blok toegevoegd onder deelse-instructie. Als er dus geenAttributeErroris, draaitelseen controleert de nieuwe code op deZeroDivisionError-exception.In het eerste scenario geven we de lijst met vier waarden
xen noemer 3. Het script voegt 50 toe aan de lijst, deelt elke waarde in de lijst door 3 en toont het resultaat.De functie werd succesvol uitgevoerd zonder exceptions op te gooien.
In plaats van een lijst hebben we een integer aan het eerste argument gegeven, wat
AttributeErroropleverde.In het laatste scenario hebben we de lijst opgegeven, maar is 0 het tweede argument, wat de
ZeroDivisionError-exception onder deelse-instructie heeft opgeworpen.Voorbeeld bestand bewerken
Bekijk meer praktische voorbeelden van een bestand laden, tekst schrijven en het bestand sluiten.
De functie
file_editor()zal:FileNotFoundError-exception controleren voor deopen()-functie.write()-functie.finally-instructie.In het eerste scenario geven we het bestandspad en de tekst op.
De buitenste exception wordt opgegooid.
Om de file not found-exception op te lossen, moeten we een bestand
data.txtaanmaken met het Linux-commandoecho.Daarna roepen we de functie
file_editor()opnieuw aan.De binnenste exception wordt opgegooid, omdat de
write()-functie de tekst niet kan toevoegen.Om dit op te lossen, moeten we de derde regel wijzigen van
data = open(path)naardata = open(path, 'a'). Hiermee kunnen we de nieuwe tekst aan het bestand toevoegen.Na het opnieuw uitvoeren van de functie hebben we de tekst succesvol aan het bestand toegevoegd.
Geneste exception handling wordt niet aanbevolen omdat het de afhandeling complexer maakt; ontwikkelaars gebruiken meerdere
try-except-blokken om eenvoudige sequentiële exception handling te maken.Let op: je kunt ook een genest
try-except-blok onder detry- ofexcept-instructie toevoegen. Het hangt gewoon af van je vereisten.Exceptions opwerpen (raise) in Python
Naast het opvangen van exceptions kun je ze bewust opwerpen met het keyword
raise. Dit is nuttig om bedrijfsregels af te dwingen of invoer te valideren. Het geeft een signaal dat er iets mis is voordat het verderop voor een lastigere fout zorgt.Om een exception op te werpen, gebruiken we het keyword
raisegevolgd door een exceptionnaam.Voorbeeld ValueError opwerpen
We kunnen eenvoudig exceptions opwerpen door een raise-keyword toe te voegen in de
if/else-instructie.In het voorbeeld werpen we
ValueErrorop als de waarde groter is dan 1.000. We hebben de waarde naar 2.000 gezet, waardoor deif-instructieTRUEwerd enValueErrormet het aangepaste bericht werd opgegooid. Het aangepaste foutbericht helpt je het probleem snel te vinden.Voorbeeld exception opwerpen
We kunnen ook een willekeurige ingebouwde Python-exception opwerpen als aan de conditie is voldaan. In ons geval hebben we een generieke Exception met het foutbericht opgegooid.
Voorbeeld opgegooide exception afhandelen
We kunnen ook een eigen exception maken en die afhandelen met het
try-except-blok.In het voorbeeld hebben we een value error-voorbeeld onder de
try-instructie toegevoegd.Hoe werkt dit? In plaats van de exception te gooien en het programma te beëindigen, toont het het door ons opgegeven foutbericht.
Dit type exception handling helpt ons ons voor te bereiden op fouten die niet door Python worden gedekt en specifiek zijn voor jouw applicatievereisten.
Exception chaining met raise ... from
Naast losse exceptions opwerpen kun je exceptions ketenen met
raise ... from. Dit bewaart de oorspronkelijke exception als context, waardoor tracebacks veel duidelijker worden wanneer de ene fout door een andere wordt veroorzaakt.Het deel
from ezet het attribuut__cause__op de nieuwe exception, zodat iedereen die de traceback leest precies kan zien wat deze triggerde. Dit is vooral nuttig in grotere applicaties waar exceptions door meerdere lagen code gaan.Wat is er nieuw in Python 3.10 - 3.13 voor exception handling?
Sinds dit blogbericht oorspronkelijk is geschreven, zijn er in nieuwere Python-versies zoals 3.10 en 3.11 belangrijke ontwikkelingen bijgekomen:
1. Structurele pattern matching in Python 3.10
Python 3.10 introduceerde structurele pattern matching, dat kan worden gebruikt om exceptions eleganter af te handelen door fouttypen in een
match-instructie te matchen. Dit is vooral handig bij het afhandelen van meerdere exceptietypen op een beter leesbare manier. Voorbeeld:2. Fijnmazige foutlocaties in tracebacks (Python 3.11)
Tracebacks in Python 3.11 tonen nu precieze foutlocaties, waardoor exceptions makkelijker te debuggen zijn.
Voor Python 3.11:
Met Python 3.11 wijzen tracebacks exact de subexpressie aan die de exception veroorzaakt:
3. Exceptiongroepen en except* (Python 3.11)
Python 3.11 introduceerde exceptiongroepen om meerdere exceptions in één blok af te handelen met
except*. Dit is nuttig voor het beheren van asynchrone code of scenario's waarin meerdere exceptions kunnen worden opgegooid. Voorbeeld:4. add_note-methode voor exceptions (Python 3.11)
Exceptions hebben nu een
add_note()-methode, waarmee ontwikkelaars aangepaste notities aan exceptions kunnen toevoegen voor betere debugging. Voorbeeld:5. PEP 654: Betere afhandeling van geneste exceptions
Met exceptiongroepen zijn geneste exceptions nu makkelijker te debuggen en af te handelen, vooral in complexe workflows zoals multiprocessing of asynchrone taken.
6. Verbeterde foutmeldingen (Python 3.12)
Python 3.12 zette een langlopende inspanning voort om foutmeldingen specifieker en bruikbaarder te maken. Zo suggereren
NameError-meldingen nu gelijkende variabelen die in scope zijn, en geven attribute errors op veelvoorkomende types gerichtere hints:7. Gekleurde tracebacks (Python 3.13)
Python 3.13 introduceerde standaard gekleurde tracebacks in de interactieve interpreter. Fouttypen, regelnummers en berichten worden nu in verschillende kleuren gemarkeerd, waardoor je veel sneller kunt scannen en begrijpen wat er misging — vooral in lange tracebacks met meerdere gekoppelde exceptions.
Conclusie
Zowel unit testing als exception handling zijn kerndelen van Python-programmeren die je code productieklaar en foutbestendig maken. In deze tutorial hebben we geleerd over exceptions en fouten in Python en hoe je ze afhandelt. Verder hebben we complexe geneste try-except-blokken behandeld en aangepaste exceptionblokken gemaakt op basis van vereisten.
Deze tools en mechanismen zijn essentieel, maar het meeste werk wordt gedaan met eenvoudige
try- enexcept-blokken. Waartryzoekt naar exceptions die door de code worden opgegooid enexceptdie exceptions afhandelt.Vind je dit verwarrend en weet je niet waar je moet beginnen? Volg dan onze cursus Introduction to Functions in Python om scoping, lambda-functies en foutafhandeling te begrijpen. Je kunt je ook inschrijven voor de Python Programmer career track om carrièrebepalende skills op te doen en een professionele Python-ontwikkelaar te worden.