Er gaat iets mis.
Geen paniek. Fouten maken hoort bij het leren programmeren. Hieronder vind je een stappenplan om zelf fouten op te sporen, gevolgd door een overzicht van de meest voorkomende fouten.
Hoe los je zélf een fout op?
Python vertelt je precies wat er mis is en op welke regel. Lees altijd de laatste regel van de foutmelding.
Traceback (most recent call last):
File "main.py", line 3
print("Hallo"
^
SyntaxError: '(' was never closed
Dit vertelt je: op regel 3 is een haakje niet gesloten.
Soms helpt het om je code regel-voor-regel hardop voor te lezen en uit te leggen wat het zou moeten doen (aan een klasgenoot, of zelfs aan een badeendje.). Vaak hoor je zelf al waar de logica niet klopt.
Loop je vast? Gebruik dan print() om de waarde van je variabelen naar het scherm te schrijven op het punt vlak voordat het misging.
x = 10
y = 3
print(f"DEBUG: op dit moment is x {x} en y {y}")
resultaat = x / y
Gebruik de Playground om een klein onderdeel van je code in isolatie te testen, in plaats van de hele applicatie keer op keer te runnen.
Foutmeldingen (De Rode Tekst)
SyntaxError
Je hebt een typfout in je code. Veelvoorkomende oorzaken:
# Haakje vergeten
print("Hallo" # FOUT
print("Hallo") # GOED
# Dubbele punt vergeten (bij if/for/def)
if leeftijd >= 18 # FOUT
if leeftijd >= 18: # GOED
# Aanhalingsteken vergeten
print("Hallo) # FOUT
print("Hallo") # GOED
IndentationError
De code na if, for, def of else móet inspringen met 4 spaties in Python.
# FOUT Geen inspringing
if leeftijd >= 18:
print("Volwassen")
# GOED Met inspringing
if leeftijd >= 18:
print("Volwassen")
NameError
Je gebruikt een variabele die niet bestaat (of waarvan de spelling afwijkt). Veelvoorkomende oorzaken:
# Variabele nog niet aangemaakt, of pas later aangemaakt
print(leeftijd) # FOUT NameError
leeftijd = 15
# Typfout in de naam (Hoofdletters zijn belangrijk!)
naam = "Alex"
print(Naam) # FOUT NameError
# Vergeten aanhalingstekens bij tekst
print(Hallo) # FOUT Python denkt nu dat Hallo een variabele is!
print("Hallo") # GOED
TypeError
Je probeert bewerkingen te doen met types die niet samen kunnen, zoals tekst (str) en een getal (int) "aan elkaar plakken" met een plusje.
leeftijd = 15
# FOUT TypeError: Python mag geen nummers en letters plussen
print("Ik ben " + leeftijd + " jaar oud.")
# GOED De oplossing is altijd een f-string:
print(f"Ik ben {leeftijd} jaar oud.")
ZeroDivisionError
Je deelt door 0, wat mathematisch niet kan.
# FOUT ZeroDivisionError
print(10 / 0)
# GOED Controleer eerst de invoer
if noemer != 0:
print(10 / noemer)
IndexError
Je probeert een element uit een lijst op te vragen die niet bestaat. Vergeet niet dat lijsten beginnen met tellen bij 0.
namen = ["Ali", "Sara", "Daan"]
# FOUT IndexError (er is geen 4e persoon op index 3!)
print(namen[3])
# GOED Index 0, 1 of 2
print(namen[2]) # "Daan"
KeyError
Je zoekt een sleutel op die niet in de dictionary staat.
leerling = {"naam": "Sara"}
# FOUT KeyError (want leeftijd ontbreekt in de dictionary)
print(leerling["leeftijd"])
# GOED Controleer eerst (bijvoorbeeld in een if statement)
if "leeftijd" in leerling:
print(leerling["leeftijd"])
Bekende Bugs en Vastlopers
Oneindige Loop
Je hebt per ongeluk een Infinite Loop gebouwd. Als dit gebeurt in de browser, loopt het tabblad helemaal vast, reageert het scherm niet meer, en moet je de pagina verversen. Dit gebeurt als je een While-loop start en je bent vergeten de teller in de loop groter te maken, waardoor de conditie altijd True blijft.
# FOUT Infinite loop: 'teller' is en blijft altijd kleiner dan 5!
teller = 0
while teller < 5:
print("Deze regel print Python tot het einde der tijden...")
# GOED Vergeet teller += 1 niet aan de loop toe te voegen:
teller = 0
while teller < 5:
print("Dit wordt netjes 5 keer geprint.")
teller += 1
= vs ==
= slaat een waarde op, == vergelijkt twee waarden met elkaar. Dit levert vaak bizarre resultaten of errors op.
# FOUT Dit slaat de waarde 18 op in de variabele 'leeftijd' (Fout in een If-statement!)
if leeftijd = 18:
print("Bingo!")
# GOED Dit vergelijkt de waarde van leeftijd met 18
if leeftijd == 18:
print("Bingo!")
Inspringen vergeten of te vroeg stoppen
Python kent geen haakjes { } voor blokken code. Code behoort pas tot de if, for, def of else met inspringing.
# FOUT Fout: dit print het woord Error maar één keer aan het EINDE van de loop!
for i in range(5):
print("Error")
# GOED Goed: in de loop
for i in range(5):
print("Success")
range() eindigt één eerder
range(5) geeft 0, 1, 2, 3, 4 — niet de 5.
# FOUT Print 0 t/m 4
for i in range(5):
print(i)
# GOED Wil je 1 tot en met 5 printen? Dan stop je bij 6!
for i in range(1, 6):
print(i)
Functie aanroepen zonder haakjes
Als je een zelfgemaakte (of ingebouwde) functie runt zónder de ronde haakjes () te gebruiken, dan slaat Python dit gewoon over zonder te klagen, of print hij dat er een functie gevonden is.
def zeg_hallo():
print("Hallo!")
# FOUT Dit doet niks en leidt niet tot een error (zeer frustrerende bug!)
zeg_hallo
# GOED Functies eisen dat de parameters direct volgen tussen haakjes
zeg_hallo()
print() vs return
Een variabele op het scherm printen (print()) betekent niet dat je daarna met dat resultaat door kan rekenen in andere functies. Wil je het antwoord later opslaan of hergebruiken? Dan móet je return gebruiken.
# FOUT Je kunt het resultaat hier niet opslaan om mee door te werken
def optellen(a, b):
print(a + b)
x = optellen(3, 5) # x heeft nu de waarde 'None'!
# GOED Met return kun je het resultaat gebruiken in je code:
def optellen(a, b):
return a + b
x = optellen(3, 5) # x is netjes 8. Je kan nu verder rekenen.