# Fouten en Uitzonderingen
# Begrippen
Fouten kunnen optreden op niveau van:
- Parse-time-fouten
De computer begrijpt de code niet. Bijvoorbeeld: syntaxis- en semantischefouten. - Compile-time-fouten
De code heeft een correcte syntaxis, maar de computer kan die niet correct uitvoeren. Bijvoorbeeld verkeerd datatype proberen te gebruiken. - Runtime-fouten
De code geeft een fout bij het uitvoeren, door bijvoorbeeld verkeerde of onverwachte input van de gebruiker. - 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.')
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("")}.')
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.')
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.')
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.')
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.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
# 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
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
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)
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)
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)
2
3
4
5
6
7
8
9
10
11
12
13
$ python3 ./python/syntax/errors_and_exceptions/raise__3.py
Exception raised.
$ _
# Bronnen
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. ↩︎