När det går fel

Det är jättevanligt med fel i våra program, eller så kallade buggar. Det drabbar även erfarna programmerare!

Några buggar uppstår på grund av att vi gör misstag i hur vi använder programmeringsspråket. I takt med att man blir mer van är det vanligt med kod som fungerar, men inte gör precis som den ska. Datorer är väldigt bokstavliga och gör precis som de blir tillsagda, även om det inte alls är vettigt.

Lyckligtvis berättar datorn också mycket om vad som gått fel. Det ska vi lära oss tyda här.

Syntaxfel

Titta på följande kod:

favorittal = int(input("Vilket är ditt favorittal?"
dubbel = favorital * 2
print(dubbel)

Den kan vi inte köra även om den vid första anblick ser rätt ut. Den är felskriven på två ställen - kan du se?

(Det saknas parenteser i slutet på första raden, och favorittal är felstavat på andra raden)

När datorn inte kan tolka vad vi skrivit, oftast på grund av att vi saknar parenteser, eller stavat fel på en variabel, kallas för syntaxfel. Vi har brutit mot själva grammatiken i språket.

Exekveringsfel

Här kommer ett annat exempel:

bredd = input("Bredd: ")
höjd = input("Höjd: ")
area = bredd * höjd
print(f"Arean av din rektangel är {area}")

Kan du se vad som är fel? Här är det lite klurigare.

(Koden är grammatiskt korrekt - det finns inga syntaxfel - men bredd och höjd omvandlas aldrig till int utan är fortfarande strängar. Därför kraschar programmet på rad 3 eftersom vi inte kan multiplicera två strängar med varandra.)

Om du provar att spara samma kod till en fil som heter test.py och kör den i IDLE kan det se ut  såhär:

Bredd: 12
Höjd: 23
Traceback (most recent call last):
    File "test.py", line 3, in <module>
        area = bredd * höjd
TypeError: can't multiply sequence by non-int of type 'str'

OBS! Felmeddelandet är på engelska eftersom IDLE är programmerade i engelska!

Detta är en annan typ av fel - ett exekveringsfel. De kan vara svåra att upptäcka förrän vi kör vårt program.

Felmeddelandet läser vi helst nedifrån och upp. Den sista raden:

TypeError: can't multiply sequence by non-int of type 'str'

Berättar vad som har hänt - vi kan inte multiplicera strängar (str). Raden ovanför visar vad för kod som försökte köras:

File "test.py", line 3, in <module>
    area = bredd * höjd

Det är alltså i filen "test.py" på rad 3 som felet uppstått. Det betyder inte att orsaken finns där, men det var där programmet inte kunde fortsätta längre. Vi kan till exempel fixa programmet genom att omvandla till int på rad 1 och 2, såhär:

bredd = int(input("Bredd: "))
höjd = int(input("Höjd: "))
area = bredd * höjd
print(f"Arean av din rektangel är {area}")

Logiska fel

En sista typ av fel som kan uppstå kallar vi logiska fel. Det är situationer när vi skrivit grammatiskt rätt kod, och programmet inte kraschar, men ändå inte gör som vi vill. Här är ett exempel:

tal = int(input("Skriv in ditt favorittal: "))
dubbla = tal * 10
print(f"Dubbla ditt favorittal är {dubbla}")

Ser du felet? Hur kan du lösa det?
(Multiplicera med 2, inte med 10, på rad 2)

Har du en fråga du vill ställa om När det går fel? Ställ den på Pluggakuten.se
Har du hittat ett fel, eller har du kommentarer till materialet på den här sidan? Mejla matteboken@mattecentrum.se
Läs sidan på andra språk

I den här videon tittar vi på ett kodexempel som både har syntaxfel, exekveringsfel, och logiska fel, och löser alla buggar.

  • Bugg: Ett fel eller misstag i ett datorprogram.
  • Syntaxfel: Vi har brutit mot själva grammatiken i språket. Vanligtvis saknas en parentes eller ett kommatecken t.ex.
  • Exekveringsfel: Koden är grammatiskt korrekt men gör något som inte är möjligt och kraschar. Exempelvis försöker vi omvandla strängen \(“abc”\) till en int – det går inte, men det vet datorn inte förrän vi kör programmet.
  • Logiska fel: Kod som är korrekt skriven och inte kraschar, men inte gör vad vi egentligen hade tänkt. Exempelvis har vi skrivit ett plustecken istället för ett minustecken.
  • Heltal (int): Ett tal utan decimaler, som \(5\) eller \(42\). Förkortas "int".