Kapitel 9
Felsökning
Förstå felet, hitta orsaken och kontrollera lösningen.
Mål
Efter kapitlet ska du kunna...
- skilja mellan syntaxfel, logiska fel och exekveringsfel
- läsa ett felmeddelandes viktigaste delar
- felsöka steg för steg
- använda tillfälliga utskrifter
- testa normalvärden, gränsvärden och felaktig indata
Tre feltyper
Felet visar sig på olika sätt
| Feltyp | Vad händer? |
|---|---|
| Syntaxfel | Programmet kan inte börja köra. |
| Logiskt fel | Programmet körs men ger fel resultat. |
| Exekveringsfel | Programmet startar men kraschar under körning. |
9.1
Syntaxfel bryter mot språkets regler
print("Hej världen"
Den avslutande parentesen saknas.
Python kan inte tolka programstrukturen och stoppar före körningen.
Syntaxfel · terminalen
Felmeddelandet pekar mot problemet
File "program.py", line 1
print("Hej världen"
^
SyntaxError: '(' was never closed
Feltypen står längst ner: SyntaxError.
Saknat kolon
if-raden är ofullständig
Fel
if age >= 18
print("Myndig")Rätt
if age >= 18:
print("Myndig")Viktig precisering
Stavfel är inte alltid syntaxfel
pritn("Hej")
Raden följer Pythons syntax och programmet börjar därför köra.
Namnet pritn finns inte. Resultatet blir ett NameError under körningen.
Hitta syntaxfel
Kontrollera tecknen nära raden
- Är alla parenteser stängda?
- Finns kolon efter
if, loopar ochdef? - Är citattecknen parvis?
- Är indraget korrekt?
- Kan felet egentligen börja på raden ovanför?
9.2
Logiska fel ger fel svar
a = 5
b = 3
summa = a - b
print(summa)
Programmet körs och skriver 2.
Uppgiften var att beräkna summan, så operatorn ska vara +.
Logiskt fel
Beräkningen sparas inte
length = 170
length + 10
print(length)
Uttrycket räknas ut men resultatet sparas inte.
length = length + 10
Nu får variabeln det nya värdet 180.
Prioriteringsfel
Programmet körs – svaret blir fel
a = 10
b = 20
average = a + b / 2
print(average)
Python räknar b / 2 först och skriver 20.0.
Rätt uttryck är (a + b) / 2, som ger 15.0.
Hitta logiska fel
Jämför med ett känt svar
- Välj enkel indata där rätt svar är känt.
- Skriv ut delresultat.
- Följ variablerna rad för rad.
- Jämför operatorer och beräkningsordning med planen.
9.3
Exekveringsfel uppstår under körning
Koden är syntaktiskt giltig.
Programmet startar.
Ett värde eller en operation gör att programmet inte kan fortsätta.
ValueError
Text kan inte bli heltal
age = int(input("Hur gammal är du? "))
Hur gammal är du? hej
ValueError: invalid literal for int()
with base 10: 'hej'
int() kan inte omvandla texten hej.
ZeroDivisionError
Division med noll
number = 10
result = number / 0
print(result)
ZeroDivisionError: division by zero
NameError
Variabelnamnet finns inte
name = "Anna"
print(namn)
NameError: name 'namn' is not defined
name och namn är två olika namn.
Interaktiv kontroll
Klassificera felet
Välj ett fall.
9.4
Läs felmeddelandet nerifrån
Traceback (most recent call last):
File "program.py", line 2, in <module>
result = number / 0
ZeroDivisionError: division by zero
- Feltyp:
ZeroDivisionError. - Förklaring:
division by zero. - Plats: filen och rad 2.
- Kodrad:
result = number / 0.
Felrad
Raden är en startpunkt
Felmeddelandet visar ofta var Python upptäckte problemet.
Den egentliga orsaken kan finnas tidigare, exempelvis ett felaktigt värde eller en saknad parentes på raden ovanför.
Kontrollera därför både den angivna raden och närliggande kod.
När ett fel uppstår
Fyra frågor
- Vilken feltyp står längst ner?
- Vilken rad anges?
- Vilka värden används på raden?
- Vad förväntade jag mig skulle hända?
9.5
Felsök systematiskt
Tillfälliga utskrifter
Se variablernas verkliga värden
Kod
a = 10
b = 20
print(f"a = {a}")
print(f"b = {b}")
print(f"a + b = {a + b}")
print(f"b / 2 = {b / 2}")
average = a + b / 2
print(f"Medelvärdet är {average}")Terminal
a = 10
b = 20
a + b = 30
b / 2 = 10.0
Medelvärdet är 20.0Utskrifterna visar exakt vilka delresultat programmet använder.
Ändra en sak i taget
Behåll orsak och verkan
Gör en liten ändring.
Kör samma test igen.
Kontrollera om beteendet ändrades som väntat.
Om många saker ändras samtidigt vet du inte vilken ändring som löste eller skapade felet.
Testa små delar
Avgränsa problemet
name = input("Vad heter du? ")
print(name)
Kontrollera först att inmatningen fungerar.
Lägg sedan tillbaka nästa del av programmet.
9.6
Testa flera sorters indata
| Testtyp | Exempel | Syfte |
|---|---|---|
| Normalvärde | 25 | vanlig användning |
| Gränsvärde | 17, 18, 19 | kontrollera gränsen |
| Felaktig indata | hej | se hur programmet reagerar |
Gränsvärden
Testa precis runt villkoret
if age >= 18:
print("Du är myndig")
else:
print("Du är inte myndig")
Testa 17: strax under gränsen.
Testa 18: exakt på gränsen.
Testa 19: strax över gränsen.
Testfall
Skriv förväntat resultat först
| Indata | Förväntat | Faktiskt |
|---|---|---|
| 17 | inte myndig | ? |
| 18 | myndig | ? |
| 19 | myndig | ? |
Ett test är användbart först när du vet vad rätt resultat ska vara.
9.7 · Övning
Hitta tre syntaxproblem
print("Hej världen"
age = 18
if age >= 18
print("Du är myndig")
- Stäng parentesen.
- Lägg till kolon efter villkoret.
- Gör indrag framför sista raden.
- Kör efter varje rättning.
Övning
Felsök medelvärdet
a = 10
b = 20
average = a + b / 2
print(average)
Skriv först vilket resultat du förväntar dig.
Lägg till utskrifter för delberäkningarna.
Rätta uttrycket och testa igen.
Sammanfattning
Kom ihåg
- Syntaxfel hindrar Python från att tolka programmet.
- Logiska fel ger fel resultat utan att programmet kraschar.
- Exekveringsfel uppstår medan programmet körs.
- Läs feltyp, radnummer och kodrad i felmeddelandet.
- Avgränsa problemet och ändra en sak i taget.
- Testa normalvärden, gränsvärden och oväntad indata.