T. Issaris
13 september 2021
Defensief programmeren: “verdedigen” tegen mogelijk foutieve invoer
Traceback (most recent call last):
File "prog2/eh001.py", line 4, in <module>
b = bmi(77, 0) # ?
File "prog2/eh001.py", line 2, in bmi
return gewicht / lengte**2
ZeroDivisionError: integer division or modulo by zero
Python raises/gooit een exceptie:
Traceback (most recent call last):
...
ZeroDivisionError: integer division or modulo by zero
De ZeroDivisionError exceptie geeft aan dat er geprobeerd werd om door 0 te delen.
De “traceback” kan helpen om uit te zoeken waar het probleem zich voordeed:
Traceback (most recent call last):
File "prog2/eh001.py", line 4, in <module>
b = bmi(77, 0) # ?
File "prog2/eh001.py", line 2, in bmi
return gewicht / lengte**2
Op regel 4 in bestand eh001.py werd “bmi” opgeroepen en dit zorgde voor uitvoering van regel 2, die de deling door 0 veroorzaakte.
Om aan te geven dat een operatie niet uitgevoerd kan worden, wordt dikwijls gebruik gemaakt van een “speciale” waarde.
Nadelen:
def gezondheid():
b = bmi(77, 1.87)
if b is None:
print("error! lengte mag niet 0 zijn")
else:
print(f"BMI: {b}")
c = ...
d = ...
return b, c, d
b, c, d = gezondheid()
# ?Hoe moeten we de fout nu afhandelen?
De code die het probleem afhandelt dient vlakbij de oproeper te staan. Excepties laten een meer flexibele manier van werken toe.
Aangeven van het probleem doe je met “raise”:
Het afhandelen van de exceptie doe je met “try/except”:
De functie gezondheid kan nu eenvoudiger gehouden worden, zonder fout afhandeling:
We gebruikten in voorgaande slides de RuntimeError class om een probleem aan te geven. Er bestaan nog vele andere voorgedefinieerde excepties:
Voorbeeld foutieve conversie string naar integer:
Voorbeeld foutieve concatenatie str met integer:
Buiten de voorgedefinieerde excepties, kan je ook zelf excepties maken.
Eigen excepties laten toe om verschillende fouten op verschillende manieren af te handelen.
class GewichtError(RuntimeError):
pass
class LengteError(RuntimeError):
pass
def bmi(gewicht, lengte):
if gewicht <= 0:
raise GewichtError
if lengte == 0:
raise LengteError
return gewicht / lengte ** 2
try:
b = bmi(0, 1.87)
print(f"BMI: {b}")
except GewichtError:
print("probleem met gewicht")
except LengteError:
print("probleem met lengte")