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?
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.
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.
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
Probeer een klein stukje van je code los uit in de speeltuin, in plaats van steeds je hele programma te draaien.
Foutmeldingen
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
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
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
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
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
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
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
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 ==
= 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
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(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
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)