Presentationer Slide 1/1

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

FeltypVad händer?
SyntaxfelProgrammet kan inte börja köra.
Logiskt felProgrammet körs men ger fel resultat.
ExekveringsfelProgrammet 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 och def?
  • Ä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

  1. Välj enkel indata där rätt svar är känt.
  2. Skriv ut delresultat.
  3. Följ variablerna rad för rad.
  4. 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

Analys
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
  1. Feltyp: ZeroDivisionError.
  2. Förklaring: division by zero.
  3. Plats: filen och rad 2.
  4. 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

  1. Vilken feltyp står längst ner?
  2. Vilken rad anges?
  3. Vilka värden används på raden?
  4. Vad förväntade jag mig skulle hända?

9.5

Felsök systematiskt

ÅterskapaLäsAvgränsaÄndra en sakTesta igen

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.0

Utskrifterna 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

TesttypExempelSyfte
Normalvärde25vanlig användning
Gränsvärde17, 18, 19kontrollera gränsen
Felaktig indatahejse 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

IndataFörväntatFaktiskt
17inte myndig?
18myndig?
19myndig?

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")
  1. Stäng parentesen.
  2. Lägg till kolon efter villkoret.
  3. Gör indrag framför sista raden.
  4. 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.