< Programmeren in Python

In Python zijn er twee types fouten: enerzijds syntaxfouten en anderzijds excepties.

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:

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 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 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

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 kan er als volgt uitzien:

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 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 men 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 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) 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 komt met de naam van excepties na het except statement, 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 finally blok 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 zodra de interpreter een niet afgehandelde exceptie tegenkomt.

Een exceptie kan zelf opgeworpen 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:

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 gooien, bijvoorbeeld 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 actieve uitzondering verder gegooid worden.

 

This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.