Python Exception Handling Using try, except and finally statement
Exceptions in Python
Python heeft veel ingebouwde exceptions die worden opgeworpen wanneer je programma een fout tegenkomt (iets in het programma gaat fout).
Wanneer deze exceptions optreden, stopt de Python-interpreter het huidige proces en geeft het door aan het aanroepende proces totdat het is afgehandeld. Als deze niet worden afgehandeld, zal het programma crashen.
Nemen we bijvoorbeeld een programma waarin we een functie A
hebben die functie B
aanroept, die op zijn beurt functie C
aanroept. Als een exceptie optreedt in functie C
maar niet wordt afgehandeld in C
, gaat de exceptie naar B
en vervolgens naar A
.
Als de exceptie nooit wordt afgehandeld, verschijnt er een foutmelding en komt ons programma onverwachts tot stilstand.
Uitzonderingen opvangen in Python
In Python kunnen uitzonderingen worden afgehandeld met behulp van een try
verklaring.
De kritische bewerking die een uitzondering kan oproepen wordt in de try
clausule geplaatst. De code die de uitzonderingen afhandelt, staat in de except
-clausule.
We kunnen dus kiezen welke bewerkingen we uitvoeren als we de uitzondering hebben opgevangen. Hier volgt een eenvoudig voorbeeld.
Uitvoer
In dit programma lopen we door de waarden van de randomList-lijst. Zoals eerder vermeld, wordt het gedeelte dat een uitzondering kan veroorzaken in het try
blok geplaatst.
Als er geen uitzondering optreedt, wordt het except
blok overgeslagen en gaat de normale stroom verder (voor de laatste waarde). Maar als er een uitzondering optreedt, wordt deze opgevangen door het except
blok (eerste en tweede waarde).
Hier drukken we de naam van de uitzondering af met behulp van de exc_info()
functie binnen sys
module. We kunnen zien dat a
ValueError
veroorzaakt en 0
ZeroDivisionError
veroorzaakt.
Omdat elke uitzondering in Python erft van de basis Exception
klasse, kunnen we de bovenstaande taak ook op de volgende manier uitvoeren:
Dit programma heeft dezelfde uitvoer als het bovenstaande programma.
Specifieke uitzonderingen in Python opvangen
In het bovenstaande voorbeeld hebben we geen specifieke uitzondering genoemd in de except
clausule.
Dit is geen goede programmeerpraktijk, omdat het alle uitzonderingen zal opvangen en elk geval op dezelfde manier zal behandelen. We kunnen specificeren welke uitzonderingen een except
clausule moet afvangen.
Een try
clausule kan een willekeurig aantal except
clausules hebben om verschillende uitzonderingen af te handelen, echter, er zal er maar één worden uitgevoerd in het geval dat een uitzondering zich voordoet.
We kunnen een tupel van waarden gebruiken om meerdere uitzonderingen in een except-clausule op te geven. Hier is een voorbeeld pseudo code.
try: # do something passexcept ValueError: # handle ValueError exception passexcept (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError passexcept: # handle all other exceptions pass
Raising Exceptions in Python
In Python programmeren, worden exceptions opgewekt wanneer er fouten optreden tijdens runtime. We kunnen ook handmatig uitzonderingen oproepen met behulp van het raise
sleutelwoord.
We kunnen optioneel waarden aan de uitzondering doorgeven om te verduidelijken waarom die uitzondering is opgeworpen.
Python try met else clause
In sommige situaties wil je misschien een bepaald blok code uitvoeren als het codeblok binnen try
zonder fouten is uitgevoerd. Voor deze gevallen kunt u het optionele else
sleutelwoord gebruiken met het try
statement.
Note: Uitzonderingen in de else clausule worden niet behandeld door de voorafgaande except clausules.
Laten we eens naar een voorbeeld kijken:
Uitvoer
Als we een oneven getal doorgeven:
Enter a number: 1Not an even number!
Als we een even getal doorgeven, wordt het reciproke berekend en weergegeven.
Enter a number: 40.25
Als we echter 0 doorgeven, krijgen we ZeroDivisionError
omdat het codeblok binnen else
niet wordt afgehandeld door het voorafgaande except
.
Python try…finally
Het try
statement in Python kan een optionele finally
clausule hebben. Deze clausule wordt hoe dan ook uitgevoerd, en wordt over het algemeen gebruikt om externe bronnen vrij te geven.
We kunnen bijvoorbeeld via het netwerk verbonden zijn met een extern datacenter of werken met een bestand of een Graphical User Interface (GUI).
In al deze omstandigheden moeten we de bron opruimen voordat het programma tot stilstand komt, of het nu succesvol is verlopen of niet. Deze acties (het sluiten van een bestand, GUI of het verbreken van de verbinding met het netwerk) worden uitgevoerd in de finally
clausule om de uitvoering te garanderen.
Hier volgt een voorbeeld van bestandsbewerkingen om dit te illustreren.
try: f = open("test.txt",encoding = 'utf-8') # perform file operationsfinally: f.close()
Dit type construct zorgt ervoor dat het bestand wordt gesloten, zelfs als er tijdens de uitvoering van het programma een uitzondering optreedt.