Programmeren in Python/Fouten
Uit Wikibooks
| Vorige: Tekst | Index | Volgende: Object-georienteerd Programmeren |
In Python zijn er twee types fouten gekend, enerzijds syntax fouten en anderzijds excepties.
[bewerken] Syntax fouten
Een 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 eens de code geïnterpreteerd wordt. Neem de volgende code als voorbeeld:
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 welke 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 bvb C waar een compiler de broncode volledig interpreteert tijdens de compilatie, is dit bij Python niet het geval, wat soms tot onaangename verassingen kan leiden.
[bewerken] Excepties
Excepties (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 gebruiken geen rechten toe heeft, ... in tegenstelling tot syntaxfouten zijn excepties niet steeds fataal, het is mogelijk een exceptie op te vangen en in code iets aan de randvoorwaarde te proberen doen, ook al is het maar een waarschuwing naar de gebruiker voortbrengen.
Een voorbeeld ziet kan er als volgt uitzien:
try: f=open("non-existing-file",'r') except IOError: print "Sorry that file does not exist"
Hierbij wordt de code die een exceptie kan opgooien in een try blok geplaatst. Dit wordt gevolgd door except IOError, dit wil zeggen dat indien de code in het try blok een IOError opgooit, deze gevangen zal worden en het print statement zal worden uitgevoerd. Een try blok kan gevolgd worden door meerdere except blokken, zo kan op elk type exceptie die opgegooid wordt anders gereageerd worden. Ook kan met except gebruiken zonder specificatie van welke exceptie men wenst op te vangen, op deze manier zal elke exceptie opgevangen worden. Een uitgebreider voorbeeld ziet er alsvolgt uit:
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) opwerpt zal print "An exception occured" uitgevoerd worden. Indien geen exceptie opgegooid werd dan zal print "Everything went fine" uitgevoerd worden. Dus wat er ook gebeurt, er zal al 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 opgooien
- Het except blok wordt opgeroepen indien het try blok een exceptie opwerpt die overeen met de naam van excepties na het
exceptstatement, indien er geen naam opgegeven is, zullen alle excepties gevangen worden. - Indien geen excepties opgegooid 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
finallyblok uitgevoerd worden. Hier zal men typisch deïnitialisatie plaatsen. Ook dit blok is optioneel.
Indien een exceptie opgegooid wordt in een functie en deze wordt nergens opgevangen, dan zal opgeworpen worden naar de boven toe en zal de applicatie termineren van zodra de interpreter een niet afgehandelde exceptie tegenkomt.
Een exceptie kan zelf opgeworden worden met behulp van raise gevolgd door de exceptie die men wenst te gooien. Het volgende voorbeeld illustreert een exceptie die opgegooid is vanaf de Python prompt:
>>> 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 gooien, bvb men vangt een exceptie op in een except blok en beslist deze naar de bovenliggende functie door te geven, dan kan met raise gebruiken zonder argumenten, dan zal dat huidig active uitzondering verder gegooid woorden.
| Vorige: Tekst | Index | Volgende: Object-georienteerd Programmeren |