Programmeren in Python/Fouten
In Python zijn er twee types fouten: enerzijds syntaxfouten en anderzijds excepties.
Syntax fouten
bewerkenEen syntax fout treedt op wanneer de Python-interpreter concludeert dat de code geen geldige Python code is. Deze check gebeurt at runtime. En een fout wordt pas gevonden wanneer de code geïnterpreteerd wordt. Neem de volgende code als voorbeeld:
Python-code: Fouten
a=1
if a==1:
print("correct")
else:
print(not correct)
In dit geval zou het duidelijk moeten zijn dat in de else
een fout staat, print dient gevolgd te worden door een string die door quotes omringd moet zijn. Nu zal dit programma perfect werken zolang a=1
bovenaan staat. Maar vervang a=1
door a=0
en men krijgt volgende uitvoer:
Traceback (most recent call last): File "k.py", line 5, in <module> print(not correct) NameError: name 'correct' is not defined
Dit heeft een belangrijke implicatie, in tegenstelling tot een programeertaal zoals bijvoorbeeld C waar een compiler de broncode volledig interpreteert tijdens de compilatie, is dit bij Python niet het geval, wat soms tot onaangename verrassingen kan leiden.
Excepties
bewerkenExcepties (uitzonderingen, Engels: exceptions) treden op wanneer de Python interpreter geldige Python code tegenkomt, maar wanneer een externe randvoorwaarde het uitvoeren niet mogelijke maakt. Een aantal voorbeelden zijn: een website openen terwijl geen internetconnectie beschikbaar is, een bestand openen in een directory waar de gebruiker geen rechten toe heeft, ... in tegenstelling tot syntaxfouten zijn excepties niet steeds fataal, het is mogelijk een exceptie op te vangen en in de code iets aan de randvoorwaarde te proberen doen, ook al is het maar een waarschuwing aan de gebruiker geven.
Het voorbeeld ziet er als volgt uit:
Python-code: Fouten
try:
f = open("non-existing-file", "r")
except IOError:
print("Sorry that file does not exist")
Hierbij wordt de code die een exceptie kan v veroorzaken in een try
blok geplaatst. Dit wordt gevolgd door except IOError
, dit wil zeggen dat indien de code in het try blok een IOError veroorzaakt, deze gedetecteerd zal worden en het print statement zal worden uitgevoerd. Een try blok kan gevolgd worden door één of meerdere except
blokken, zo kan op elk type exceptie die ontstaat anders gereageerd worden. Ook kan men except gebruiken zonder specificatie van welke exceptie men wenst te detecteren, op deze manier zal elke exceptie verwerkt worden. Een uitgebreider voorbeeld ziet er als volgt uit:
Python-code: Fouten
f = None
try:
f = open("non-existing-file", "r")
# Perform I/O
except:
print("An exception occured.")
else:
print("Everything went fine.")
finally:
print("Closing file if needed.")
if f != None:
f.close()
Wat gebeurt hier? Eerst zal in het try blok een file geopend worden en kan er I/O gebeuren, indien deze actie een exceptie (eender welke) geeft zal print "An exception occured"
uitgevoerd worden. Indien er geen exceptie ontstond dan zal print "Everything went fine"
uitgevoerd worden. Dus wat er ook gebeurt, er zal minimaal iets op het scherm getoond worden. Vervolgens zal geprobeerd worden om de file te sluiten. Dus om samen te vatten:
- Het try blok bevat code die eventueel een exceptie kan veroorzaken.
- Het except blok wordt opgeroepen indien het try blok een exceptie veroorzaakt die overeen komt met de naam van excepties na het
except
statement, indien er geen naam opgegeven is, zullen alle excepties verwerkt worden. - Indien geen excepties ontstaan worden in het try blok en er is een else blok aanwezig, dan zal dit else blok uitgevoerd worden.
- In elk geval zal de code uit het
finally
blok uitgevoerd worden. Hier zal men typisch deïnitialisatie plaatsen. Ook dit blok is optioneel.
Indien een exceptie veroorzaakt wordt in een functie en deze wordt nergens gedetecteerd, dan zal de excepties naar een bovenliggende functie worden doorgegeven en wordt de applicatie gestopt zodra de interpreter een niet afgehandelde exceptie tegenkomt.
Een exceptie kan zelf veroorzaakt worden met behulp van raise
gevolgd door de exceptie die men wenst te tonen. Het volgende voorbeeld illustreert een exceptie die veroorzaakt is vanaf de Python prompt:
Python-code: Fouten
>>> raise Exception("uh oh")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception: uh oh
Wanneer men een exceptie verder wenst te beoordelen, bijvoorbeeld men vangt een exceptie op in een except
blok en beslist om deze naar de bovenliggende functie door te geven, dan kan met raise
zonder argumenten gebruiken, dan zal dat de huidige actieve uitzondering verder verwerkt worden.