Waarom generieke meldingen niet werken
Stel je voor dat een systeem een waarschuwing geeft: "Temperatuur te hoog!" Maar de werkelijke waarde was 60.5ยฐC en de limiet is 60ยฐC. Je weet niet of het een fout is of een test, of hoe ver boven de grens het gaat. Debuggen wordt een raadsspel.
Informatieve meldingen lossen dit op door altijd de waarde mee te nemen. Dit geeft context die essentieel is voor:
- Debugging: De ontwikkelaar ziet direct welke waarde het probleem triggerde.
- Logging: Logs bevatten de feitelijke waardes, niet alleen labels.
- Monitoring: Systemen kunnen automatisch patronen herkennen in gemeten waarden.
Het basispatroon: f-strings
Een f-string laat je waarden rechtstreeks in een string invoegen:
temperature = 62
max_temp = 60
# Oud
print("Temperatuur te hoog!")
# Nieuw
print(f"Temperatuur te hoog: {temperature}ยฐC (max: {max_temp}ยฐC)")
De output is: Temperatuur te hoog: 62ยฐC (max: 60ยฐC)
Constanten gebruiken voor leesbaarheid
Als dezelfde limiet op meerdere plaatsen gebruikt wordt, zet je deze in een constante. Dat voorkomt fouten en maakt wijzigingen makkelijker:
MAX_TEMP = 60
CPU_THRESHOLD = 85
DISK_THRESHOLD = 90
temperature = 62
cpu_usage = 88
disk_usage = 92
if temperature > MAX_TEMP:
print(f"Temperatuur: {temperature}ยฐC (max: {MAX_TEMP}ยฐC)")
exit()
if cpu_usage > CPU_THRESHOLD:
print(f"CPU: {cpu_usage}% (max: {CPU_THRESHOLD}%)")
exit()
if disk_usage > DISK_THRESHOLD:
print(f"Schijf: {disk_usage}% vol (max: {DISK_THRESHOLD}%)")
exit()
Voordeel: als je later MAX_TEMP naar 65 wilt veranderen, wijzig je het op ONE plek. Alle meldingen passen zich automatisch aan.
Formattering voor decimalen: :.1f en :d
Soms wil je waardes in een bepaald formaat tonen:
:.1f โ รฉรฉn decimaal (float). Voorbeeld: f"{3.14159:.1f}" geeft 3.1
:d โ integer (geheel getal). Voorbeeld: f"{3.9:d}" geeft 3 (afgekapt)
:.0f โ nul decimalen (afgerond). Voorbeeld: f"{3.14:.0f}" geeft 3
temperature = 62.8
memory_usage = 87.4
uptime_days = 127.5
# Met formattering
print(f"Temp: {temperature:.1f}ยฐC") # โ "Temp: 62.8ยฐC"
print(f"Geheugen: {memory_usage:.0f}%") # โ "Geheugen: 87%"
print(f"Uptime: {uptime_days:d} dagen") # โ "Uptime: 127 dagen"
Structuur van een goede melding
Een goede foutmelding beantwoordt altijd drie vragen:
- Wat is het probleem? "Temperatuur te hoog"
- Wat hebben we gemeten? 62ยฐC
- Wat is de limiet? max 60ยฐC
Slechte melding: "Fout!" (niets duidelijk)
Goede melding: f"Temperatuur: {temp}ยฐC (max: {max_temp}ยฐC)" (alles duidelijk)
Simulatie: zie het verschil
Interactieve demo: Verander de waarde en zie hoe beide meldingen reageren
Informatief
f"CPU: 55% (max: 80%)"
Waarom dit uitmaakt in de praktijk
Logboeken: Alle foutmeldingen worden opgeslagen. Met informatieve meldingen kun je maanden later nog zien wat de problematische waarde was.
Monitoring: Monitoring-tools kunnen meldingen parsen en statistieken bijhouden. "CPU: 88% (max: 80%)" is heel anders dan "CPU: 92% (max: 80%)".
Team debugging: Als iemand je vraagt "Wat was het probleem?", kan jij zeggen "De CPU zat op 88%, limiet was 80%" in plaats van "Het systeem zei dat de CPU te hoog was."
Stelregel: Elke guard clause melding moet zo duidelijk zijn dat je zonder de broncode begrijpt wat er misging. Niet "Fout!" maar "CPU: 88% (max: 80%)".