Ga naar hoofdinhoud

Er gaat iets mis

Geen paniek. Fouten maken hoort bij leren programmeren. Hieronder vind je eerst een stappenplan om zelf een fout op te sporen, en daarna de fouten die het vaakst voorkomen.


Hoe los je zelf een fout op?​

1. Lees de laatste regel van de foutmelding

Python vertelt je wat er mis is en op welke regel. Lees altijd eerst 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.

2. Leg je code uit aan iemand anders

Lees je code regel voor regel hardop voor en vertel wat elke regel zou moeten doen, aan een klasgenoot of desnoods aan een badeendje. Vaak hoor je zelf al waar het niet klopt.

3. Kijk wat er in je variabelen staat

Loop je vast? Zet dan een print() vlak voor de plek waar het misgaat, en kijk wat er op dat moment in je variabelen staat.

x = 10
y = 3
print(f"x is {x} en y is {y}")
resultaat = x / y
4. Maak het probleem klein

Probeer een klein stukje van je code los uit in de speeltuin, in plaats van steeds je hele programma te draaien.


Foutmeldingen​

SyntaxError​

SyntaxError

Python snapt de regel niet: er ontbreekt een teken. De melding zegt welk.

SyntaxError: '(' was never closed
# FOUT
print("Hallo"

# GOED
print("Hallo")
SyntaxError: unterminated string literal (detected at line 1)
# FOUT
print("Hallo)

# GOED
print("Hallo")
SyntaxError: expected ':'
# FOUT
leeftijd = 18
if leeftijd >= 18
print("Volwassen")

# GOED
leeftijd = 18
if leeftijd >= 18:
print("Volwassen")

IndentationError​

IndentationError

De regels na if, for, while, def of else moeten inspringen, met 4 spaties.

IndentationError: expected an indented block after 'if' statement on line 2
# FOUT
leeftijd = 18
if leeftijd >= 18:
print("Volwassen")

# GOED
leeftijd = 18
if leeftijd >= 18:
print("Volwassen")

NameError​

NameError

Je gebruikt een naam die Python niet kent. Meestal is het een tikfout, een hoofdletter die anders is, of tekst zonder aanhalingstekens. Ook een variabele die pas verderop in je code een waarde krijgt, kent Python nog niet.

NameError: name 'Naam' is not defined. Did you mean: 'naam'?
# FOUT
naam = "Alex"
print(Naam)

# GOED
naam = "Alex"
print(naam)

TypeError​

TypeError

Je probeert tekst en een getal samen te gebruiken op een manier die niet kan, bijvoorbeeld ze met + aan elkaar plakken.

TypeError: can only concatenate str (not "int") to str
# FOUT
leeftijd = 15
print("Ik ben " + leeftijd + " jaar oud.")

# GOED
leeftijd = 15
print("Ik ben", leeftijd, "jaar oud.")

Met een komma in print() gaat het goed, en later doe je het met een f-string. Komt de tekst uit input() en wil je ermee rekenen, maak er dan eerst een getal van met int(): zie Tekst naar getal.

ZeroDivisionError​

ZeroDivisionError

Je deelt door 0, en dat kan niet.

ZeroDivisionError: division by zero
# FOUT
noemer = 0
print(10 / noemer)

# GOED
noemer = 0
if noemer != 0:
print(10 / noemer)
else:
print("Delen door 0 kan niet.")

IndexError​

IndexError

Je vraagt een plek in een lijst op die er niet is. Een lijst begint te tellen bij 0.

IndexError: list index out of range
# FOUT
namen = ["Ali", "Sara", "Daan"]
print(namen[3])

# GOED
namen = ["Ali", "Sara", "Daan"]
print(namen[2])

Drie namen staan op plek 0, 1 en 2. Plek 3 bestaat niet.

KeyError​

KeyError

Je zoekt een sleutel op die niet in de dictionary staat.

KeyError: 'leeftijd'
# FOUT
leerling = {"naam": "Sara"}
print(leerling["leeftijd"])

# GOED
leerling = {"naam": "Sara"}
if "leeftijd" in leerling:
print(leerling["leeftijd"])

Fouten zonder foutmelding​

Deze fouten geven geen rode tekst, maar je programma doet niet wat je wilt.

Een loop die nooit stopt​

Een loop die nooit stopt

Blijft de voorwaarde van een while-loop altijd True, dan stopt de loop nooit. In de browser loopt het tabblad dan vast. De speeltuin heeft geen stopknop: herlaad de pagina, en je code is dan weg. Kopieer je code daarom eerst als je een while-loop gaat proberen.

# FOUT
teller = 0
while teller < 5:
print("Dit stopt nooit.")

# GOED
teller = 0
while teller < 5:
print("Dit print je 5 keer.")
teller = teller + 1

In de foute versie wordt teller nooit groter, dus teller < 5 blijft waar.

= of ==​

= of ==

= geeft een variabele een waarde, == vergelijkt twee waarden. In een if hoort ==.

SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
# FOUT
leeftijd = 18
if leeftijd = 18:
print("Gefeliciteerd")

# GOED
leeftijd = 18
if leeftijd == 18:
print("Gefeliciteerd")

Deze fout geeft wel een melding, maar hij staat hier omdat hij zo vaak gebeurt.

Te ver of te weinig ingesprongen​

Te ver of te weinig ingesprongen

Wat inspringt onder een for, hoort bij de loop en gebeurt elke ronde. Wat niet inspringt, gebeurt één keer, na de loop.

# FOUT: print staat in de loop, dus je ziet 1, 3 en 6
totaal = 0
for getal in [1, 2, 3]:
totaal = totaal + getal
print(totaal)

# GOED: print staat na de loop, dus je ziet alleen 6
totaal = 0
for getal in [1, 2, 3]:
totaal = totaal + getal
print(totaal)

range() stopt één eerder​

range() stopt één eerder

range(5) geeft 0, 1, 2, 3 en 4, en niet 5.

# Dit print 0 tot en met 4
for i in range(5):
print(i)

# Wil je 1 tot en met 5? Dan stop je bij 6
for i in range(1, 6):
print(i)

Een functie zonder haakjes​

Een functie zonder haakjes

Schrijf je de naam van een functie zonder (), dan roep je hem niet aan. Python klaagt niet: er gebeurt niets.

def zeg_hallo():
print("Hallo")

# Dit doet niets, zonder foutmelding
zeg_hallo

# Dit roept de functie aan
zeg_hallo()
print() of return

Een functie die zijn antwoord print, zet het alleen op het scherm. Wil je met het antwoord verder rekenen, dan heb je return nodig.

# FOUT: x krijgt niets, de waarde None
def optellen(a, b):
print(a + b)

x = optellen(3, 5)

# GOED: x krijgt 8, en daar kun je mee verder
def optellen(a, b):
return a + b

x = optellen(3, 5)