01E: Errors

Wanneer je programmeert zul je regelmatig fouten (ook wel errors of bugs genaamd) maken. Het voorkomen, begrijpen, en herstellen van fouten is een belangrijk onderdeel van programmeren. Python zal zijn best doen om alles precies zo uit te voeren als je het vraagt, maar als Python niet begrijpt wat je vraagt, dan zal het programma niet uitgevoerd worden. Python zal dan proberen je enige informatie te geven over wat er mis ging, om je te helpen de fout te herstellen.
Hier volgen twee fouten in een Python-programma.

Voorbeeld: Een fout tegen de grammatica (syntax error)

In dit eerste voorbeeld vergaten we de haakjes te gebruiken die nodig zijn bij print(...). Python begrijpt niet wat je vraagt te doen.

Hier is een tweede voorbeeld van een bug (fout) in Python.

Voorbeeld: Een runtime error

In het tweede voorbeeld zijn we vergeten de variabele test te definiëren. Python begrijpt wat je wilt, maar omdat test niet is gedefinieerd, treedt er een fout op.

Een syntax error (fout tegen de grammatica) treedt op wanneer Python niet begrijpt wat je wilt zeggen. Een runtime error treedt op wanneer Python begrijpt wat je wilt zeggen, maar vervolgens is Python niet in staat de opdracht uit te voeren.

In het Nederlands zou een syntax error (fout tegen de grammatica) bijvoorbeeld zijn:

De kachel kat hond aap.

Deze zin is grammaticaal onjuist. Er ontbreekt een werkwoord (actie). Het is niet te begrijpen wat er bedoeld wordt. Syntax betekent hetzelfde als grammatica.

In het Nederlands geeft de volgende zin een runtime error:

Eet de piano.

Grammaticaal is de zin correct — er is een werkwoord en een zelfstandig naamwoord op de juiste plaats — en het is duidelijk wat je moet doen. Maar, er is een probleem wanneer je zou beginnen met het eten van de piano (tenzij je een termiet bent).

Een derde soort fouten zijn de logische fouten: dat houdt in dat je programma wordt uitgevoerd zonder vast te lopen, maar niet het goede resultaat oplevert.
Een voorbeeld hiervan in het Nederlands is:
Sluit aub de achterdeur zodat er geen muizen kunnen binnen komen.
Dit zou een fout zijn tegen de logica als bijvoorbeeld de voordeur ook open staat, ook al heeft de opdracht zin en kun je de achterdeur sluiten. Maar het voldoet niet aan het doel de muizen buiten te houden, omdat ze nog steeds door de voordeur naar binnen kunnen komen.

Vaak voorkomende syntax errors in Python

Hier volgen enkele vaak voorkomende fouten tegen de grammatica van Python.

Voorbeeld: Syntax Error

Python reageert met SyntaxError: invalid syntax en wijst met ^ naar het uitroepteken ! . Het probleem is dat dit teken daar geen betekenis heeft in Python. De syntax error treedt niet op als we print("Hello, World!") intikken, want dankzij de aanhalingstekens begrijpt Python dat het uitroepteken deel is van de tekst Hello, World!.
Hier volgt een syntax error die nog meer kennis vraagt:

Voorbeeld: Syntax Error
Het probleem is dat class een speciaal woord is in Python. Wanneer je course in plaats van class had geschreven zou dat in orde zijn geweest. Klik hier om de lijst met alle gereserveerde "woorden" in Python te bekijken.

Wanneer je aanhalingstekens gebruikt en het tweede vergeet, of wanneer je haakjes gebruikt en het tweede vergeet, zul je ook syntax errors krijgen.

Voorbeeld: Syntax Error
Het tweede aanhalingsteken ontbreekt

EOL is hier de afkorting van End Of Line: Python verwachtte meer, namelijk een ", voordat het het einde van de regel bereikte.

Voorbeeld: Syntax Error
Het haakje sluiten ontbreekt

EOF is de afkorting van End Of File: Python bleef zoeken naar ), maar het eind van het programma werd bereikt voordat het sluithaakje werd gevonden.

Runtime errors

Nu volgen een paar runtime errors. Python is in staat te begrijpen wat het programma zegt, maar komt in de problemen wanneer het de instructies probeert uit te voeren.

  • gebruik van een ongedefinieerde variabele. Dit kan ook gebeuren wanneer je de hoofdletters of kleine letters niet precies gebruikt:
    Voorbeeld
    Een niet gedefinieerde variabele
  • delen door 0, hetgeen geen betekenis heeft in de wiskunde. (Waarom? Omdat 0 keer elk getal gelijk is aan 0. Er is geen waarde voor X te vinden zodanig dat 1 = X * 0, waaruit volgt dat 1/0 ongedefinieerd is.)
    Voorbeeld
    Delen door 0
  • operatoren gebruiken met verkeerde types van data
    Voorbeeld
    Optellen van tekst en een getal

Je zult meer mogelijkheden ontdekken om fouten te produceren wanneer je meer over Python leert.

Wat is, in technische zin, het verschil tussen syntax errors and runtime errors? Hier volgt een voorbeeld waarbij een runtime error wordt vergeleken met een syntax error. Kijk naar de uitvoer van elk van de programma's.
Voorbeeld: Runtime error
Voorbeeld: Syntax Error
Het program met een runtime error gaf een uitvoer, maar die met een syntax ervoor niet. Dit komt doordat Python een programma in twee stappen uitvoert:

  1. Python gaat na of je programma de juiste syntax heeft. Dit om de structuur en de delen van het programma na te gaan.
  2. Wanneer geen syntax errors worden aangetroffen in stap 1, wordt het programma uitgevoerd.

Dus een programma met een syntax error zal helemaal niet worden uitgevoerd, terwijl een programma met een runtime error uitgevoerd zal worden totdat de fout plaatsvindt.

Fouten tegen de logica

Je programma kan tot een einde komen zonder te crashen maar helaas niet het gewenste resultaat opleveren. Je wilt bijvoorbeeld het gemiddelde van twee getallen uitrekenen: het gemiddelde van x en y is gedefinieerd als

\displaystyle{\frac{x+y}{2}}

Waarom werkt dit programma niet zoals het hoort?

Voorbeeld
Dit berekent niet op correcte wijze het gemiddelde.

Het gemiddelde moet zijn

\displaystyle{\frac{x+y}{2}=\frac{3+4}{2}=\frac{7}{2}=3.5}

maar het programma drukt af 5.0! Deze fout heeft te maken met de "volgorde van de operaties" bij rekenen. Wanneer je schrijft x + y / 2, dan heeft dat dezelfde betekenis als x + (y / 2) = 3 + (4 / 2) = 3 + 2 = 5. Om dit probleem op te lossen, moet de derde regel van je programma worden geschreven als gemiddelde = (x + y) / 2, hetgeen duidelijk maakt aan Python dat we echt de waarde \frac{x+y}{2} willen, waarbij we eerst willen optellen en dan pas delen.

Je loopt tegen logische fouten op omdat je het programma niet juist hebt ontworpen, of wanneer je een programma schrijft dat niet het ontwerp volgt (zoals bij het voorbeeld met het gemiddelde). Logische fouten zijn lastig op te sporen, zeker bij een langer programma, maar je zult betere programma's schrijven naarmate je meer ervaring krijgt. In les 6D zullen een aantal tips worden gegeven om logische fouten te voorkomen.

Oefeningen

Nu de les af is, volgen drie oefeningen waar je moet debuggen (de fouten in een programma verbeteren). Je kunt proberen de fouten te vinden voordat je het programma uitvoert, maar je kunt het programma ook eerst proberen uit te voeren om de reactie die Python geeft te gebruiken om na te gaan wat verbeterd moet worden.

Ieder programma is al voor een groot gedeelte ingetypt. Je hoeft maar een paar tekens (letters/symbolen/getallen) te veranderen om het programma in orde te krijgen. Het nakijkprogramma zal een oplossing dat teveel wijzigingen aanbrengt afwijzen. Klik op Reset code to default wanneer je terug wilt gaan naar de beginsituatie.

Programmeeroefening: Zomer
Verbeter de syntax error in het volgende programma, zodanig dat de som van de getallen 1 t/m 10 wordt afgedrukt.

Programmeeroefening: Hello Joe
Verbeter de runtime error in het volgende programma, zodanig dat het Hello op de eerste regel afdrukt en Joe op de tweede regel. Je mag hoogstens twee tekens veranderen.

De laatste opgave is moeilijker dan de twee voorgaande. Wanneer je vast komt te zitten, kun je deze overslaan en naar de volgende les gaan. Je kunt altijd nakijken welke opgaven je hebt afgemaakt of overgeslagen door naar Mijn voortgang te gaan.

Programmeeroefening: Groei
Verbeter de logische fout in dit programma: de bedoeling ervan is de hoeveelheid mensen te berekenen van je dorp in de komende drie jaar, ervan uitgaande dat we beginnen met 1000 mensen in 2012, en dat het aantal mensen stijgt met 10% per jaar. Je mag hoogstens drie tekens veranderen.
Indien je vast zit, klik dan hier voor een hint.

Ga door met de volgende les, zodra je alle fouten (bugs) hebt verbeterd.