try:
port = config["port"]
timeout_val = int(config["timeout"])
except KeyError:
print("โ Sleutel ontbreekt")
port = 8080
timeout_val = 30
except ValueError:
print("โ Waarde is geen getal")
timeout_val = 30
Oplossing 2: Beide exceptions in รฉรฉn except
try:
port = config["port"]
timeout_val = int(config["timeout"])
except (KeyError, ValueError):
print("โ Fout in configuratie")
port = 8080
timeout_val = 30
Interactieve demo: twee exception-types, twee reacties
Kies scenario:
Verschil: welke oplossing kiezen?
โ Oplossing 2 (beide tegelijk)
Goed als je hetzelfde wilt doen voor alle fouten.
โ Oplossing 1 (aparte except)
Beter als je anders reageert per exception-type.
Vuistregel: Aparte except blokken als je anders moet reageren. รรฉn blok met meerdere types als je hetzelfde doet.
Meerdere exceptions: strategie, logging, en real-world patterns
Het probleem diepgaand
Veel code-paden leiden tot fout. Je kunt niet รฉรฉn except ValueError gebruiken als ook KeyError, IndexError, of TypeError kan optreden. Alle aparte exceptions af te vangen is slecht (je voorkrijgt te veel code), maar alles met รฉรฉn catch is ook slecht (je weet niet WรT fout ging).
Strategie 1: Aparte except-blokken (ander gedrag per fout)
try:
timeout_str = config["timeout"] # KeyError mogelijk
timeout = int(timeout_str) # ValueError mogelijkexcept KeyError:
print("Sleutel ontbreekt")
timeout = 30
except ValueError:
print("Timeout is geen getal")
timeout = 30
Strategie 2: Groeperen (als reactie hetzelfde is)
try:
values = list_data[index]
result = int(values)
except (IndexError, ValueError) as e:
print(f"Data fout: {e}")
result = 0
Hier gebruiken we as e om de exception-object te krijgen en de details af te drukken.
Strategie 3: try/except/else/finally
Voor complexere logica:
try:
# Poging
value = int(user_input)
except ValueError:
# Alleen als ValueErrorprint("Fout!")
else:
# Alleen als GEEN exception (try slaagde)print(f"Succes: {value}")
finally:
# ALTIJD, of exception of nietprint("Klaar")
Praktisch voorbeeld: meerdere fouttypes afvangen
try:
items = data_list[index] # IndexError mogelijk
value = int(items) # ValueError mogelijkexcept IndexError:
print("Index bestaat niet")
value = 0
except ValueError:
print("Niet numeriek")
value = 0
try:
...
except Exception: # โ Vangt ALLES eerstprint("Error")
except ValueError: # โ Wordt nooit bereikt!print("ValueError")
Interactieve demo: aparte vs. gegroepeerd
Selecteer scenario:
Strategie:
Best practice: Aparte except-blokken voor verschillende reacties. Groeperen (meerdere types in รฉรฉn except) als je hetzelfde doet. Altijd loggen welke exception optrad met as e en type(e).__name__.
>_Probeer het voorbeeld
Experimenteer: test meerdere except-blokken en groepering.
Klik op de knop om de uitvoer van het voorbeeld te zien.
Opdracht: configuratie veilig laden
Een monitoring-tool leest zijn configuratie uit een dictionary. Niet alle keys bestaan altijd, en waarden kunnen ongeldig zijn. Bestand: config_safe.py
Maak een dictionary server_config met enkele velden (bijv. host, port, timeout).
Probeer minstens twee velden op te halen en te converteren.
Vang KeyError en ValueError af met aparte except-blokken.
Elk fout-type krijgt een ander bericht (wat fout ging).
Zet sensibele defaults in beide gevallen.
Acceptatiecriteria
Twee aparte except-blokken: รฉรฉn voor KeyError, รฉรฉn voor ValueError.
Elk except-blok print een ander bericht.
Defaults worden ingesteld als fout optreedt.
Script crasht nooit, ook niet met onvolledige config.
Finaal worden de waarden geprint (of defaults).
Extra โ alleen als je klaar bent
Breid uit naar meer robuustheid:
Voeg try/except/else/finally toe: log alleen succes in else-blok.
Voeg validatie toe (bijv. port moet 1โ65535 zijn) en vang ValueError op.
Gebruik as e en type(e).__name__ om te loggen welk exception-type optrad.
Test met minstens drie verschillende config-scenario's (OK, KeyError, ValueError).
Acceptatiecriteria
Try/except/else/finally structuur aanwezig.
Validatie met ValueError-opvang (bijv. port-bereik).
Exception-type wordt gelogd met as e en type(e).__name__.