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
- Vad blir resultatet när programmet körs?
- Varför blir resultatet fel?
- 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
- Vad händer om användaren skriver 0?
- Varför uppstår ett fel?
- 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
- Vilken typ av fel uppstår när programmet körs?
- Varför uppstår felet?
- 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
- Vad blir fel i programmet?
- Hur kan du använda
print()för att felsöka? - 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
- Vilka olika värden kan du testa i programmet?
- Varför är det bra att testa flera olika värden?
- 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
- Vilket fel finns i koden?
- 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
- Vad är felet i programmet?
- 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
- Vad händer om användaren skriver 0?
- 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
- Varför blir resultatet fel?
- 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
- Varför skrivs inget ut?
- Hur ska funktionen anropas?
Övning 6
Programmet ska skriva ut talen 1 till 5.
for i in range(5)
print(i)
Frågor
- Vilket syntaxfel finns i koden?
- Hur ska koden ändras?
9.8 Reflektionsfrågor
- Vad är ett syntaxfel?
- Vad är ett logiskt fel?
- Vad är ett exekveringsfel?
- Vilken typ av fel är lättast att upptäcka, och varför?
- Hur kan felmeddelanden hjälpa dig när du programmerar?
- Varför är det viktigt att testa program med olika värden?
- Hur kan
print()hjälpa dig att felsöka ett program? - Vad betyder det att felsöka systematiskt?
- Vad kan hända om man inte kontrollerar användarens inmatning?
- Hur kan du bli bättre på att hitta fel i din kod?