# Fouten en Uitzonderingen

# Begrippen

Fout

Een fout (Eng. error) veroorzaakt een onverwacht gedrag in een programma.

Uitzondering

Een uitzondering (Eng. exception) is niet altijd een fout. Soms is een uitzondering een verwacht gedrag.

Fouten kunnen optreden op niveau van:

  1. Parse-time-fouten
    De computer begrijpt de code niet. Bijvoorbeeld: syntaxis- en semantischefouten.
  2. Compile-time-fouten
    De code heeft een correcte syntaxis, maar de computer kan die niet correct uitvoeren. Bijvoorbeeld verkeerd datatype proberen te gebruiken.
  3. Runtime-fouten
    De code geeft een fout bij het uitvoeren, door bijvoorbeeld verkeerde of onverwachte input van de gebruiker.
  4. Logische fouten
    De code werkt zoals bedoeld, maar de programmeur heeft de functionaliteit verkeerd ontworpen en geïmplementeerd.

De parse-time- en compile-time-fouten worden tijdens het programmeren ontdekt, en logische fouten duiken normaal op tijdens acceptatietesten[1]

De runtime-fouten zijn als programmeur moeilijker te vinden, daarom is het belangrijk dat de code die mogelijkheid opvangt en zorgt dat de software niet crasht, maar de fouten netjes afhandelt.

Als code afhangt van een bepaalde input moet je altijd de mogelijkheid van foutieve data opvangen.

# Fouten Afhandelen

# Try-Except

Een try-statement moet altijd minstens gevolgd worden door één except-statement. Een except «expressie»-statement vangt enkel fouten op van een bepaald datatype, die je in een


 

 


# ./python/syntax/errors_and_exceptions/try_except.py
try:
    print(x)
except NameError:
    print('Variable x does not exist.')
1
2
3
4
5
$ python3 ./python/syntax/errors_and_exceptions/try_except.py
Variable x does not exist.
$ _

Er kan een except per exception zijn.



 

 

 


# ./python/syntax/errors_and_exceptions/try_except_except.py
y = 1
try:
    print('' + y)
except NameError:
    print('Variable x does not exist.')
except TypeError:
    print(f'Variable y is a {type(y)}, but must be {type("")}.')
1
2
3
4
5
6
7
8
$ python3 ./python/syntax/errors_and_exceptions/try_except_except.py
Variable y is a <class 'int'>, but must be <class 'str'>.
$ _

# Try-Except-Else

Een else-statement wordt enkel uitgevoerd als er geen exceptions gedetecteerd werden.



 

 

 


# ./python/syntax/errors_and_exceptions/try_except_else.py
x = 1
try:
    print(x)
except NameError:
    print('Variable x does not exist.')
else:
    print('No exceptions were found.')
1
2
3
4
5
6
7
8
$ python3 ./python/syntax/errors_and_exceptions/try_except_else.py
1
No exceptions were found.
$ _

# Try-Except-Finally

Een finally-statement wordt altijd uitgevoerd.


 

 

 


# ./python/syntax/errors_and_exceptions/try_except_except.py
try:
    print(x)
except NameError:
    print('Variable x does not exist.')
finally:
    print('Finished.')
1
2
3
4
5
6
7
$ python3 ./python/syntax/errors_and_exceptions/try_except_finally.py
Variable x does not exist.
Finished.
$ _


 

 

 

 


# ./python/syntax/errors_and_exceptions/try_except_else_finally.py
x = 1
try:
    print(x)
except NameError:
    print('Variable x does not exist.')
else:
    print('No exceptions were found.')
finally:
    print('Finished.')
1
2
3
4
5
6
7
8
9
10
$ python3 ./python/syntax/errors_and_exceptions/try_except_else_finally.py
1
No exceptions were found.
Finished.
$ _

# Resources

Als je werkt met een resource zoals een stream, dan moet die altijd terug vrijgegeven worden, ook al is er niets mee gebeurd.

Mappen & Bestanden

  • ./python/syntax/errors_and_exceptions/
    • lipsum.txt
    • try_finally.py
    • with.py
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
1

# Try-Finally






 
 
 
 
 
 



# ./python/syntax/errors_and_exceptions/try_finally.py
import os

try:
    file_url = f'{os.path.dirname(__file__)}{os.path.sep}lipsum.txt'
    my_file = open(file_url, 'r')
    try:
        data = my_file.read()
        print(data)
    finally:
        my_file.close()
except FileNotFoundError:
    pass
1
2
3
4
5
6
7
8
9
10
11
12
13
$ python3 ./python/syntax/errors_and_exceptions/try_finally.py
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

$ _

# With

Met een with gebeurt de close() automatisch.






 
 
 



# ./python/syntax/errors_and_exceptions/with.py
import os

try:
    file_url = f'{os.path.dirname(__file__)}{os.path.sep}lipsum.txt'
    with open(file_url, 'r') as my_file:
        data = my_file.read()
        print(data)
except FileNotFoundError:
    pass
1
2
3
4
5
6
7
8
9
10
$ python3 ./python/syntax/errors_and_exceptions/with.py
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

$ _

# Opwerpen

# Raise



 



# ./python/syntax/errors_and_exceptions/raise__1.py
try:
    raise Exception('Exception raised.')
except Exception as message:
    print(message)
1
2
3
4
5
$ python3 ./python/syntax/errors_and_exceptions/raise__1.py
Exception raised.
$ _


 







# ./python/syntax/errors_and_exceptions/raise__2.py
def raise_an_exception():
    raise Exception('Exception raised.')


try:
    raise_an_exception()
except Exception as message:
    print(message)
1
2
3
4
5
6
7
8
9
$ python3 ./python/syntax/errors_and_exceptions/raise__2.py
Exception raised.
$ _


 











# ./python/syntax/errors_and_exceptions/raise__3.py
def raise_an_exception():
    raise Exception('Exception raised.')


def my_function():
    raise_an_exception()


try:
    my_function()
except Exception as message:
    print(message)
1
2
3
4
5
6
7
8
9
10
11
12
13
$ python3 ./python/syntax/errors_and_exceptions/raise__3.py
Exception raised.
$ _

# Bronnen


  1. Acceptatietesten zijn testen in opdracht van de opdrachtgever die nagaan of de software doet wat gevraagd werd. Indien de testen slagen dan accepteert de opdrachtgever het eindresultaat en wordt het project officieel beëindigd. ↩︎

© 2024 Arteveldehogeschool Laatst bijgewerkt: 14/2/2020, 11:07:52