Foutmeldingen lezen en een klein project
Een Python-traceback lees je van onderen: de laatste regel noemt de fout en de regel boven de code toont waar die optrad.
Een mot in een logboek geplakt in 1947
De meeste bugs zijn tegenwoordig codefouten en Python is goed in het melden van de fouten die het kan opsporen. Beginners zien een rode fout vaak als oordeel. Het is eerder een afleverbon: wat misging, op welke regel en in welk codedeel. De kunst is te weten waar je moet kijken.
Lees een traceback van onder naar boven
total = 0
count = 0
print(total / count)Traceback (most recent call last):
File "main.py", line 3, in <module>
print(total / count)
~~~~~~^~~~~~~
ZeroDivisionError: division by zeroBegin bij de laatste regel. ZeroDivisionError: division by zero geeft het fouttype en een korte uitleg. Ga daarna omhoog naar de File-regel: de bestandsnaam en regelnummer 3. Op je computer staat daar het volledige mappad; hier is dat verkort tot main.py. De regel eronder is de code zelf. Python 3.12 markeert de mislukte bewerking precies met ^ onder het teken /. Begin pas iets te veranderen nadat je alle drie hebt gelezen. Gebeurt de fout binnen een functie, dan noemt de traceback elke aanroep op weg ernaartoe. De onderste File-regel is meestal degene die je als eerste moet bekijken.
| Fout | Gebruikelijke oorzaak | Voorbeeld |
|---|---|---|
| SyntaxError | Ongeldige Python-regel: ontbrekende haak, dubbele punt of aanhalingsteken | print("hoi" |
| IndentationError | Ontbrekende of ongelijke inspringing | if x > 1: zonder ingesprongen regel |
| NameError | Een nog niet bestaande naam, vaak een typefout | pritn("hoi") |
| TypeError | Een bewerking op het verkeerde type | "Age: " + 15 |
| ValueError | Juist type, onmogelijke waarde | int("abc") |
| IndexError | Index voorbij het einde van een lijst of string | [1, 2][2] |
| KeyError | Sleutel niet in het woordenboek | {"a": 1}["b"] |
| ZeroDivisionError | Delen door nul | 5 / 0 |
Een SyntaxError verschilt van de rest. Python vindt die vóór uitvoering, dus zelfs regel 1 wordt niet uitgevoerd en er is geen ‘Traceback’-kop. Alle andere ontstaan tijdens uitvoering nadat de eerdere regels hun werk al hebben gedaan. Een verwachte fout kun je opvangen met try en except, behandeld in het foutenhoofdstuk van de handleiding: Python probeert het ingesprongen blok en voert bij die fout het except-blok uit in plaats van te stoppen.
print("ervoor")
n = int("abc")
print("erna")ervoor
Traceback (most recent call last):
File "main.py", line 2, in <module>
n = int("abc")
^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'text = "abc"
try:
n = int(text)
except ValueError:
n = 0
print(n)0De lastigste bugs geven geen melding. Een logische fout is een programma dat werkt en het verkeerde antwoord afdrukt, zoals het cijferprogramma uit het hoofdstuk over if dat 85 een C gaf. Python kent je bedoeling niet. Gebruik de spoortabel of tijdelijke print-regels met variabelen bij elke stap en verwijder ze nadat de bug gevonden is.
Klein project: een zakgeldoverzicht
Het project gebruikt iets uit bijna elk hoofdstuk: een uitgavenwoordenboek, een functie die een totaal teruggeeft, een for-lus, een f-string en een if. Typ het over, voer het uit en maak het dan van jezelf: verander items, voeg een categorie toe of waarschuw als één item meer dan de helft van het zakgeld kost.
def total(spent):
t = 0
for amount in spent.values():
t += amount
return t
allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
print(f"{item}: {amount} won")
print(f"Uitgegeven {used}, over {left}")
if left < 15000:
print("Minder dan de helft over")snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Uitgegeven 17000, over 13000
Minder dan de helft overMaak voordat je iets wijzigt een spoortabel voor used en left en voorspel wat een extra item van 6000 won doet. Ga dan bewust debuggen: verwijder de dubbele punt na def, schrijf spent eenmaal verkeerd en deel used door nul. Lees elke traceback van onderen voordat je de fout herstelt. Een programma kunnen breken en herstellen is de echte vaardigheid die deze cursus opbouwt.
| traceback | Pythons foutrapport; lees van onderen |
| SyntaxError | Ongeldige code, gevonden vóór uitvoering |
| NameError | Een niet bestaande naam, vaak een typefout |
| TypeError | Een bewerking op het verkeerde waardetype |
| ValueError | Het juiste type met een onmogelijke waarde, zoals int("abc") |
| logische fout | Werkt zonder melding maar geeft het verkeerde antwoord |
| try / except | Voert bij die fout het except-blok uit in plaats van te stoppen |
- Welke tracebackregel noemt het fouttype?
- De eerste regel
- De File-regel
- De laatste regel
- De regel met ^-tekens
- Welke fout veroorzaakt
int("12a")?- TypeError
- ValueError
- NameError
- SyntaxError
- Welke fout veroorzaakt
pritn("hoi")?- SyntaxError
- NameError
- TypeError
- Geen fout
- Een programma drukt regel 1 af en stopt met een fout op regel 2. Welk fouttype kan niet de oorzaak zijn?
- SyntaxError
- NameError
- TypeError
- ZeroDivisionError
- Wat drukt deze code af?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - Wat gebeurt er wanneer dit wordt uitgevoerd?
print("begin") print(5 / 0) print("einde")- Het drukt begin en einde af
- Het drukt begin af en stopt dan met ZeroDivisionError
- Het stopt met ZeroDivisionError vóór iets af te drukken
- Het drukt begin, inf en einde af
- Een programma werkt zonder melding maar drukt het verkeerde totaal af. Welk fouttype is dat?
- SyntaxError
- Logische fout
- NameError
- IndentationError
- Wat drukt deze code af?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - Zet de regels van dit kleine programma op volgorde zodat het onderstaande resultaat verschijnt.Uitvoer
80.0 - Waar zit de bug? def avg(nums): return sum(nums) / len(nums), aangeroepen met avg([]).
- sum van een lege lijst is een fout
- len([]) is 0, dus er wordt door nul gedeeld
- return kan geen deling bevatten
- Er is geen bug
- ‘De fout zit op de genoemde regel, dus daar moet het herstel.’ Vaak, maar niet altijd. In het functiehoofdstuk stopt x = show_area(4, 3), gevolgd door x * 2, met een TypeError bij x * 2, maar de echte fout is de print in show_area die return moest zijn. Lees de genoemde regel en vraag waar de waarden vandaan kwamen.
- ‘Alles in try/except verpakken herstelt fouten.’ Het verbergt ze alleen. Vang een specifieke verwachte fout, zoals ValueError uit int(input()), en handel die zinvol af.
- ‘Geen foutmelding betekent dat het programma klopt.’ Logische fouten verlopen stil. Test met invoer waarvan je het antwoord al kent, inclusief grensgevallen zoals een lege lijst of grensleeftijd.
- Lees een traceback van onderen: fouttype, bestand en regel, gemarkeerde code.
- SyntaxError stopt het programma voordat regel 1 wordt uitgevoerd; andere fouten stoppen tussentijds.
- try/except handelt een verwachte fout af.
- Logische fouten geven geen melding: volg de uitvoering en test met bekende antwoorden.
- Debuggen betekent bewust breken en herstellen tot meldingen gewoon voelen.
Bronnen van deze cursus (6)
- Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
- Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
- Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
- General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
- Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
- Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)
Geraadpleegd: 2026-10-19