Programmering nivå 1 med Python

Kapitel 9: Felsökning

I detta kapitel lär du dig att förstå syntaxfel, logiska fel och exekveringsfel samt att felsöka program systematiskt.

Innehållsförteckning

Klicka på ett avsnitt för att hoppa direkt.

9.1 Syntaxfel

När man programmerar gör man ofta misstag i koden. Ett vanligt fel är syntaxfel.

Ett syntaxfel betyder att koden inte följer språkets regler. Python kan då inte köra programmet.

När ett syntaxfel uppstår visar Python ett felmeddelande.

Felmeddelandet talar ofta om

  • vilken rad felet finns på
  • vilken typ av fel som uppstod

Exempel på syntaxfel

I Python måste parenteser stängas.

print("Hej världen"

Här saknas en avslutande parentes.

Programmet kan därför inte köras.

Exempel med saknat kolon

Efter if måste man skriva kolon.

Fel kod

age = 18
if age >= 18
    print("Du är myndig")

Rätt kod

age = 18
if age >= 18:
    print("Du är myndig")

Exempel med stavfel

Om man skriver fel på ett kommando kan Python inte förstå koden.

Fel kod

pritn("Hej")

Rätt kod

print("Hej")

Hur man hittar syntaxfel

När Python visar ett felmeddelande är det bra att

  • läsa felmeddelandet
  • titta på raden som anges
  • kontrollera parenteser, kolon och stavning

Övning

Vilka syntaxfel finns i följande kod?

print("Hej världen"
age = 18
if age >= 18
print("Du är myndig")

9.2 Logiska fel

Ett logiskt fel uppstår när programmet kan köras utan felmeddelanden men ändå ger fel resultat.

Python hittar inte dessa fel automatiskt eftersom koden är korrekt skriven enligt språkets regler. Problemet är istället hur programmet är konstruerat.

Logiska fel är mycket vanliga när man programmerar.

Exempel på logiskt fel

Programmet nedan ska räkna ut summan av två tal.

Fel kod

a = 5
b = 3
summa = a - b
print(summa)

Programmet körs utan problem, men resultatet blir fel eftersom man råkade använda minus istället för plus.

Rätt kod

a = 5
b = 3
summa = a + b
print(summa)

Ett annat exempel

Programmet ska lägga till 10 cm till en längd.

Fel kod

length = 170
length + 10
print(length)

Resultatet blir fortfarande 170 eftersom värdet aldrig sparades i variabeln.

Rätt kod

length = 170
length = length + 10
print(length)

Hur man hittar logiska fel

Logiska fel kan vara svårare att upptäcka än syntaxfel. Några vanliga metoder är

  • skriva ut variabler med print() för att kontrollera värden
  • testa programmet med olika indata
  • gå igenom koden rad för rad

Övning

Programmet ska räkna ut medelvärdet av två tal. Koden innehåller ett logiskt fel.

a = 10
b = 20
average = a + b / 2
print(average)

Frågor

  1. Vad blir resultatet när programmet körs?
  2. Varför blir resultatet fel?
  3. Hur ska koden ändras för att beräkna medelvärdet korrekt?

9.3 Exekveringsfel

Ett exekveringsfel uppstår när programmet startar men kraschar medan det körs.

Koden är alltså syntaktiskt korrekt, men något händer under körningen som gör att programmet inte kan fortsätta.

Python visar då ett felmeddelande som talar om vad som gick fel.

Exekveringsfel kallas ibland runtime error.

Vanliga orsaker är

  • fel typ av data
  • division med noll
  • försök att använda en variabel som inte finns

Exempel: fel datatyp

Programmet försöker omvandla text till ett tal.

age = int(input("Hur gammal är du? "))
print(age + 5)

Om användaren skriver

hej

kan Python inte omvandla texten till ett heltal. Programmet kraschar då med ett felmeddelande.

Exempel: division med noll

Division med noll är inte tillåten i matematik.

number = 10
result = number / 0
print(result)

Programmet kraschar eftersom man inte kan dela ett tal med noll.

Exempel: variabel som inte finns

name = "Anna"
print(namn)

Här finns ett stavfel. Variabeln namn existerar inte.

Python visar då ett felmeddelande.

Hur man hittar exekveringsfel

När ett exekveringsfel uppstår kan du

  • läsa felmeddelandet noggrant
  • kontrollera vilken rad felet uppstod på
  • kontrollera indata från användaren
  • testa programmet med olika värden

Övning

Koden nedan innehåller ett exekveringsfel.

number = int(input("Skriv ett tal: "))
result = 100 / number
print(result)

Frågor

  1. Vad händer om användaren skriver 0?
  2. Varför uppstår ett fel?
  3. Hur skulle man kunna undvika detta problem i ett program?

9.4 Läsa felmeddelanden

När ett program innehåller fel visar Python ett felmeddelande.

Felmeddelandet hjälper programmeraren att förstå vad som gick fel och var felet finns i koden.

Ett felmeddelande innehåller ofta

  • filens namn
  • radnumret där felet uppstod
  • vilken typ av fel det är

Exempel

Om följande kod körs

age = int(input("Hur gammal är du? "))
print(age + 5)

och användaren skriver

hej

kan Python visa ett felmeddelande som liknar detta

ValueError: invalid literal for int()

Det betyder att Python försökte omvandla text till ett heltal men misslyckades.

Exempel med division med noll

number = 10
result = number / 0
print(result)

Python visar då ett felmeddelande som

ZeroDivisionError: division by zero

Det betyder att programmet försökte dela ett tal med noll.

Vad man ska göra när ett fel uppstår

När ett felmeddelande visas kan du

  • läsa vilken typ av fel det är
  • titta på raden där felet uppstod
  • kontrollera variabler och beräkningar
  • testa programmet igen efter ändring

Att lära sig läsa felmeddelanden är en viktig del av programmering.

Övning

Koden nedan innehåller ett fel.

age = input("Hur gammal är du? ")
result = age + 5
print(result)

Frågor

  1. Vilken typ av fel uppstår när programmet körs?
  2. Varför uppstår felet?
  3. Hur kan koden ändras så att programmet fungerar?

9.5 Systematisk felsökning

När ett program inte fungerar är det viktigt att felsöka steg för steg.

Systematisk felsökning betyder att man undersöker problemet på ett lugnt och ordnat sätt istället för att bara gissa.

Det är ett viktigt arbetssätt i programmering.

Ett bra arbetssätt

När du felsöker kan du göra så här

  • läs felmeddelandet noggrant
  • titta på raden där felet finns
  • kontrollera variabler och värden
  • testa små delar av programmet
  • ändra en sak i taget

Om man ändrar för många saker samtidigt blir det svårare att förstå vad som faktiskt löste problemet.

Använd print vid felsökning

Ett enkelt sätt att felsöka är att skriva ut värden med print().

Exempel

age = int(input("Hur gammal är du? "))
print(age)

Då kan du kontrollera vilket värde variabeln faktiskt har.

Exempel

Programmet ska räkna ut summan av två tal, men resultatet blir fel.

a = 10
b = 5
summa = a - b
print(summa)

Om du felsöker systematiskt kan du upptäcka att operatorn är fel.

Rätt kod är

a = 10
b = 5
summa = a + b
print(summa)

Testa små delar

Om ett program är långt kan det vara bra att testa en liten del i taget.

Till exempel kan du först kontrollera att input fungerar.

name = input("Vad heter du? ")
print(name)

När den delen fungerar kan du gå vidare.

Sammanfattning

Systematisk felsökning betyder att du

  • arbetar steg för steg
  • läser felmeddelanden
  • kontrollerar värden
  • testar små delar av programmet
  • ändrar en sak i taget

Det gör det lättare att hitta och rätta fel.

Övning

Programmet nedan ska räkna ut medelvärdet av två tal, men något är fel.

a = int(input("Skriv första talet: "))
b = int(input("Skriv andra talet: "))
average = a + b / 2
print(f"Medelvärdet är {average}")

Frågor

  1. Vad blir fel i programmet?
  2. Hur kan du använda print() för att felsöka?
  3. Hur ska koden ändras för att ge rätt medelvärde?

9.6 Testa program

När man skriver program är det viktigt att testa att programmet fungerar korrekt.

Att testa ett program betyder att man kör programmet med olika indata för att kontrollera att resultatet blir rätt.

Testning hjälper programmeraren att upptäcka

  • logiska fel
  • felaktiga beräkningar
  • problem med indata

Testa med olika värden

Ett program bör testas med flera olika värden.

Exempel

age = int(input("Hur gammal är du? "))
print(age + 5)

Man kan testa programmet med olika åldrar

  • 10
  • 18
  • 30

Då kan man kontrollera att programmet alltid ger rätt resultat.

Testa gränsvärden

Det är också bra att testa gränsvärden.

Gränsvärden är värden som ligger nära en gräns i programmet.

Exempel

age = int(input("Hur gammal är du? "))
if age >= 18:
    print("Du är myndig")
else:
    print("Du är inte myndig")

Bra testvärden kan vara

  • 17
  • 18
  • 19

Då kan man kontrollera att programmet hanterar gränsen korrekt.

Testa felaktig indata

Det är också viktigt att tänka på vad som händer om användaren skriver något oväntat.

Exempel

age = int(input("Hur gammal är du? "))

Om användaren skriver

hej

kommer programmet att krascha.

I senare kapitel kommer vi att lära oss hur man kan hantera sådana fel.

Övning

Programmet nedan räknar ut hur gammal en person är om tio år.

age = int(input("Hur gammal är du? "))
future_age = age + 10
print(f"Om tio år är du {future_age} år gammal")

Frågor

  1. Vilka olika värden kan du testa i programmet?
  2. Varför är det bra att testa flera olika värden?
  3. Vad händer om användaren skriver text istället för ett tal?

9.7 Övningar

I dessa övningar ska du träna på att hitta och rätta fel i program.

Övningarna innehåller olika typer av fel

  • syntaxfel
  • logiska fel
  • exekveringsfel

Övning 1

Programmet ska skriva ut en hälsning, men koden innehåller ett fel.

name = input("Vad heter du? ")
print("Hej " name)

Frågor

  1. Vilket fel finns i koden?
  2. Hur ska koden ändras för att fungera?

Övning 2

Programmet ska räkna ut summan av två tal, men resultatet blir fel.

a = 8
b = 4
summa = a - b
print(summa)

Frågor

  1. Vad är felet i programmet?
  2. Hur ska koden ändras?

Övning 3

Programmet kraschar när det körs.

number = int(input("Skriv ett tal: "))
result = 50 / number
print(result)

Frågor

  1. Vad händer om användaren skriver 0?
  2. Varför uppstår felet?

Övning 4

Programmet ska räkna ut medelvärdet av två tal.

a = 10
b = 20
average = a + b / 2
print(average)

Frågor

  1. Varför blir resultatet fel?
  2. Hur ska koden ändras?

Övning 5

Programmet ska använda en funktion, men något saknas.

def greet(name):
    print(f"Hej {name}")

greet

Frågor

  1. Varför skrivs inget ut?
  2. Hur ska funktionen anropas?

Övning 6

Programmet ska skriva ut talen 1 till 5.

for i in range(5)
print(i)

Frågor

  1. Vilket syntaxfel finns i koden?
  2. Hur ska koden ändras?

9.8 Reflektionsfrågor

  1. Vad är ett syntaxfel?
  2. Vad är ett logiskt fel?
  3. Vad är ett exekveringsfel?
  4. Vilken typ av fel är lättast att upptäcka, och varför?
  5. Hur kan felmeddelanden hjälpa dig när du programmerar?
  6. Varför är det viktigt att testa program med olika värden?
  7. Hur kan print() hjälpa dig att felsöka ett program?
  8. Vad betyder det att felsöka systematiskt?
  9. Vad kan hända om man inte kontrollerar användarens inmatning?
  10. Hur kan du bli bättre på att hitta fel i din kod?