2.3. Foutmeldingen#

We zijn in het vorige deel al een aantal keer een script tegengekomen waarbij er iets fout liep tijdens het uitvoeren. Voordat we onze scripts verder gaan uitbreiden is het belangrijk om te leren met foutmeldingen om te gaan. Als we instructies geven aan een computer, moeten die altijd maar op één manier te interpreteren zijn. Onze instructies moeten dus duidelijk én correct zijn.

2.3.1. Voorbeeld#

Kopieer het volgende stukje code naar een nieuw script en probeer het eens uit te voeren.

a = 123 + 'def'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-682dcaee1975> in <cell line: 1>()
----> 1 a = 123 + 'def'

TypeError: unsupported operand type(s) for +: 'int' and 'str'

We geven Python hier de instructie om een getal (int) en een stukje tekst (str) bij elkaar op te tellen. Als we dat doen, loopt Python vast bij het uitvoeren. De output die geprint wordt geeft in dit geval een redelijk duidelijke aanwijzing wat er fout ging.

Als er in een groter script een regel staat die een fout oplevert zal Python vastlopen en het script niet meer verder uitvoeren.

a = 1
b = 'b'
print(a)

c = a + b
print(a)
1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-506050c4b5eb> in <cell line: 5>()
      3 print(a)
      4 
----> 5 c = a + b
      6 print(a)

TypeError: unsupported operand type(s) for +: 'int' and 'str'

We zien dat er eerst nog wel een 1 geprint wordt (door de derde regel), maar dat het uitvoeren stopt wanneer Python bij de regel komt waar een foute optelling gedaan moet worden.

2.3.2. Ontcijferen#

Het kan voorkomen dat de melding die Python geeft behoorlijk cryptisch overkomt. Als we bijvoorbeeld c = a + b vervangen door c = b + a (dus een str nemen en daar een int bij optellen in plaats van andersom), ziet de foutmelding er al een beetje anders uit dan eerst:

a = 1
b = 'b'
print(a)

c = b + a
print(a)
1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-c3ba4d7896f4> in <cell line: 5>()
      3 print(a)
      4 
----> 5 c = b + a
      6 print(a)

TypeError: can only concatenate str (not "int") to str

Dat ziet er dus al een stuk anders uit. In het eerdere geval namen we een getal, en probeerden we daarbij een str op te tellen. We kregen een melding dat we het +-teken niet mochten gebruiken om een int en een str bij elkaar op te tellen.

Nu nemen we in het laatste voorbeeld een str, en proberen we daarbij een getal op te tellen. De standaard-operatie die Python uitvoert als we een str willen optellen is ze aan elkaar vast plakken (zie onder).

a = 'abc'
b = '123'
c = a + b
print(c)
abc123

Python klaagt hier dat het alleen een str aan een andere str kan vastplakken (concatenaten), en dat dat niet met een int lukt. Er wordt geen melding gemaakt van het +-teken dat verkeerd gebruikt wordt.

Om foutmeldingen goed te kunnen ontcijferen moeten we dus best al wat kennis hebben over de werking van Python, en over de begrippen (str, int, contcatenate, operand type(s)). Maak je geen zorgen als je (nog) niet de volledige foutmelding begrijpt.

Bij het ontcijferen van een foutmelding zijn er twee dingen die erg belangrijk zijn. Het meest relevant bij het oplossen van fouten zijn het regelnummer waar de code vastloopt, en het type foutmelding dat er optreedt. Deze worden altijd in de console geprint en zullen wij hieronder verder bespreken.

Regelnummer#

Bij het uitvoeren van welke regel code is er iets fout gegaan?

Wanneer we op zoek gaan naar een fout in onze code is het vaak belangrijk om te weten waar de fout is opgetreden. Hierom geeft Python je het regelnummer van je script waar de fout is gevonden.

Vaak worden er meerdere regels code genoemd als er iets fout gaat. Dat is behulpzaam als we grotere programma’s gaan schrijven, waarbij meerdere scripts elkaar aanspreken. Maar voor beginners is vaak alleen de laatst genoemde regel van belang, zo ook in de bovenstaande voorbeelden.

Je kunt in IDLE op twee manieren gemakkelijk naar de regel die de fout veroorzaakt heeft navigeren:

  • Klik met de rechtermuisknop in de foutmelding op de regelaanduiding, en kies Go to file/line.

  • Zet regelnummeraanduiding inIDLE aan via het menu (zie 1, 2). Zoek vervolgens zelf de regel op in je script.

In Spyder staan standaard regelnummers aan, en kun je als het goed is vrij eenvoudig regel code waar de fout optrad vinden.

Merk op dat de echte fout soms wel wat eerder gemaakt wordt. In het volgende voorbeeld is de fout eigenlijk dat de variabele b als een string wordt ingevoerd, terwijl de foutmelding zal gaan over het optellen.

a = 1
b = '2'

print(a + b)

Bij het repareren van foutjes kan het dus voorkomen dat je zelf wat verder terug moet kijken dan het regelnummer van de fout aangeeft.

Soort fout#

Wat voor soort fout is er geconstateerd?

In de laatste regel van de foutmelding wordt het soort fout benoemd. Vaak staat daar nog een zin achter waarin zo goed mogelijk beschreven wordt wat er precies fout ging, al is dit laatste niet altijd behulpzaam. De meest voorkomende fouten staan opgesomd in de tabel hieronder.

Soort

Omschrijving

Voorbeeldcode

TypeError

Er gaat iets mis met een operatie, omdat het type variabelen niet overeenkomt met het commando dat gebruikt wordt.

a = 123 + 'def'

NameError

Python kan een variabele met de aangegeven naam niet vinden.

a = 1; print(b)

ZeroDivisionError

Je probeert een getal door 0 te delen.

a = 3 / 0

IndexError

Je vraagt een element van een list op die niet bestaat.

a = [1, 2]; print(a[5])

KeyError

Je vraagt een element van een dict op die niet bestaat.

info = {'naam': 'sander', 'leeftijd': 32}; print(info['adres'])

SyntaxError

Je hebt een stukje code geschreven dat niet aan de grammaticale programmeerregels voldoet.

b = (a + )

Voor de SyntaxError zal IDLE je al waarschuwen voordat het uitvoeren van de code begint. Voor andere foutmeldingen zal het vaak pas tijdens het uitvoeren duidelijk worden dat er iets fout gaat.


1

Options > Show Line Numbers (eenmalig)

2

Options > Configure IDLE > General > Editor Preferences > Show line numbers in new windows (voor alle nieuwe editor-vensters die je opent.)