Als developer, wil ik fouten opvangen op de plek waar ze kunnen ontstaan, zodat mijn programma een duidelijke melding geeft in plaats van te crashen.
Taak 3: Finally: code die ALTIJD loopt
Na try/except nu de volgende stap: finally โ code die voert uit, of exception optreedt of niet.
Finally: opruimen ongeacht uitkomst
Tot nu toe zag je try/except: je vangt fouten af. Maar soms moet je iets doen โ ongeacht of fout optrad.
Het probleem: je wilt code uitvoeren die รณf exception รณf niet โ bijv. bestand sluiten, connectie verbreken.
# Zonder finally: je vergeet opruimen als fout optreedttry:
data = int(input_str)
print(f"Succes: {data}")
except ValueError:
print("Fout!")
# Maar logging MOET altijd gebeuren!
Oplossing: finally blok
try:
data = int(input_str)
print(f"Succes: {data}")
except ValueError:
print("Fout!")
data = 0
finally:
print("--- Verwerking klaar ---")
# Dit loopt ALTIJD, of except of niet
Flow: hoe loopt het?
TRYCode uitvoeren
OKโ Exception? Nee
FINALLYVoert uit
OR
EXCEPTIONโ Exception? Ja
FINALLYVoert uit
Interactieve demo: twee paden, รฉรฉn finally
Kies scenario:
โ
FINALLY
๐ง Opruimen
๐ง Resources sluiten
Voert ALTIJD uit
Vuistregel:finally voert ALTIJD uit, of exception of niet. Gebruik het voor opruimen: bestanden sluiten, verbindingen verbreken, logging.
Finally: flow controle, edge cases, en best practices
Het probleem diepgaand: resource leaks
Resources (bestanden, verbindingen) moeten altijd schoongemaakt worden, ook als fouten optreden. Zonder finally risico je resource leaks: bestanden blijven open, geheugen wordt niet vrijgegeven.
Waarom finally essentieel is
Stel je leest sensordata. Of conversie slaagt of niet โ je wilt dat de sensor is uitgeschakeld. Finally garandeert dit:
try:
temperature = float(sensor_data)
print(f"Temp: {temperature}")
except ValueError:
print("Sensor defect")
finally:
shutdown_sensor() # ALTIJD, zelfs als ValueError
try:
value = int("abc")
finally:
print("klaar")
# โ ValueError NIET afgevangen, script crasht!# โ Finally voert uit, maar jij moet afvangen:try:
value = int("abc")
except ValueError:
value = 0
finally:
print("klaar")
Fout 2: Opruimen in except in plaats van finally
# โ Opruimen vergeten als try slaagt!try:
result = int(data)
except ValueError:
close_connection() # Maar wat als try OK was?# โ Finally garandeert opruimen in beide gevallentry:
result = int(data)
except ValueError:
result = 0
finally:
close_connection() # ALTIJD
Wanneer finally gebruiken
โ Gebruik finally voor opruimen:
Bestanden sluiten
Netwerk-verbindingen verbreken
Sensoren uitschakelen
Locks/mutexes vrijgeven
โ Niet voor:
Fouten afvangen (daarvoor is except)
Business logic
Interactieve demo: hoe finally zich gedraagt
Scenario:
Best practice: Gebruik finally voor opruimen, NIET voor normale logic. Try/except/else/finally gives je volledige controle over alle paden.
>_Probeer het voorbeeld
Experimenteer: zie hoe finally zich gedraagt in verschillende scenario's.
Klik op de knop om de uitvoer van het voorbeeld te zien.
Opdracht: sensoren veilig afsluiten
Je meetscript leest sensordata uit. Of de conversie slaagt of niet, je wilt altijd loggen dat je klaar bent. Bestand: sensor_cleanup.py
Maak een scenario waar je sensordata uitlazen probeert (bijv. stringwaarde naar float).
Gebruik try/except om fouten af te vangen.
Voeg finally toe: print altijd dat het systeem is opgeruimd.
Test met zowel geldige als ongeldige data.
Zorg dat finally voert uit op BEIDE paden (OK en exception).
Acceptatiecriteria
Try/except/finally structuur aanwezig.
Finally blok voert uit op beide paden (try OK en exception).