01E: Errors

Wanneer je programmeert zul je regelmatig fouten (ook wel 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 wat je vraagt, maar als Python niet begrijpt wat je vraagt, dan zal het programma niet uitgevoerd worden. Evenzeer, zal Python 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 fout)

In dit eerste voorbeeld, vergaten we de haakje 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).

We zullen ook logische fouten ter sprake brengen, dat houdt in dat je programma wordt uitgevoerd zonder vast te lopen, maar niet het goede resultaat oplevert.
Een voorbeeld hiervan zou zijn kunnen zijn
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: al hoewel de opdracht zin heeft en je de achterdeur kunt 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

Voorbeeld: Syntax Error

Python reageert met SyntaxError: invalid syntax en wijst met ^ naar het uitroepteken. Het probleem is dat het ! geen betekenis heeft in Python. De syntax error zou verdwijnen zodra we print("Hello, World!") zouden hebben ingetypt, want daardoor begrijpt Python dat het ! deel is van de tekst Hello, World.
Hier volgt een syntax error dat 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 de tweede vergeet, of wanneer je haakjes gebruikt en de tweede vergeet, zul je ook syntax errors krijgen.

Voorbeeld: Syntax Error
De tweede aanhalingstekens zijn vergeten

Bij deze fout, EOL is de afkorting van End Of Line: Python verwacht meer, namelijk een " voor dat het einde van de regel was bereikt.

Voorbeeld: Syntax Error
Het haakje sluiten is vergeten

Evenzo, is EOF de afkorting van End Of File: Python bleef zoeken naar ), maar het eind van het programma werd bereikt voor dat 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 gedfinieerde variabele
  • delen door 0, hetgeen geen betekenis heeft in de wiskunde. (Waarom? Omdat 0 keer elk getal gelijk is aan 0. Er is geen oplossing te vinden zodanig dat 1 = X * 0, waaruit volgt dat 1/0 ongedefinieerd is.)
    Voorbeeld
    Delen door 0
  • operatoren gebruiken met verschillende type 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 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 de stappen zal uitvoeren tot dat de fout plaats vindt.

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 ze 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 karakters (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
Verbter de runtime error im het volgende programma, zodanig dat het Hello op de eerste regel afdrukt en Joe op de tweede regel. Je mag hoogstens twee karakters 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 karakters veranderen.
Indien je vast zit klik dan hier voor een hint.

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