Presentationer Slide 1/1

Kap 4.2

Try/except och felsökning

Hantera förväntade fel och använd felmeddelanden för att hitta buggar.

Mål

Efter lektionen ska du kunna...

  • förklara vad ett undantag är
  • fånga vanliga undantag med try/except
  • välja rätt undantagstyp för felet
  • läsa en traceback och hitta felraden

Repetition

Du har sett grunden tidigare

I kapitel 1.6 fångade du ValueError vid felaktig inmatning.

Nu använder vi samma idé för fler feltyper.

  • FileNotFoundError
  • ZeroDivisionError
  • TypeError

Undantag

Ett fel uppstår under körningen

tal = int("hej")
ValueError

Texten kan inte tolkas som ett heltal.

Utan felhantering avbryts programmet.

Struktur

Så arbetar try/except

try:
    # Kod som kan orsaka ett fel
except ValueError:
    # Kod som hanterar just ValueError

Python försöker först köra koden i try.

Rätt except-block körs endast om det angivna felet uppstår.

ValueError

Fånga felaktig inmatning

try:
    tal = int(input("Skriv ett heltal: "))
    print(f"Du skrev: {tal}")
except ValueError:
    print("Fel: Du måste skriva ett heltal!")

Två flöden

När inmatningen är giltig

Skriv ett heltal: 25
  1. int("25") ger heltalet 25.
  2. Resten av try-blocket körs.
  3. except-blocket hoppas över.
Du skrev: 25

Två flöden

När inmatningen är felaktig

Skriv ett heltal: hej
  1. int("hej") orsakar ValueError.
  2. Resterande kod i try hoppas över.
  3. except ValueError körs.
Fel: Du måste skriva ett heltal!

Specifika fel

Fånga det fel du förväntar dig

  • ValueError: värdet har fel format.
  • FileNotFoundError: filen finns inte.
  • ZeroDivisionError: division med noll.
  • TypeError: typer används på ett olämpligt sätt.

Ett specifikt except gör felhanteringen tydligare.

Filhantering

Fånga en fil som saknas

try:
    with open("saknas.txt", "r") as fil:
        innehåll = fil.read()
except FileNotFoundError:
    print("Filen hittades inte.")

open() orsakar felet om filen inte finns.

Programmet visar ett begripligt meddelande i stället för att krascha.

Koppling till 4.1

"r" kräver en befintlig fil

open("data.txt", "r")

Kan ge FileNotFoundError.

except FileNotFoundError:

Hanterar det förväntade problemet.

Division

Fånga division med noll

try:
    tal = int(input("Skriv ett tal: "))
    resultat = 10 / tal
    print(resultat)
except ZeroDivisionError:
    print("Du kan inte dividera med noll!")

Om användaren skriver 0 uppstår ZeroDivisionError.

Upptäck luckan

Vad händer om användaren skriver text?

tal = int(input("Skriv ett tal: "))
Skriv ett tal: hej

int("hej") orsakar ValueError.

except ZeroDivisionError fångar inte ett ValueError.

Programmet behöver hantera båda förväntade felen.

Flera feltyper

Använd flera except-block

try:
    tal = int(input("Skriv ett tal: "))
    resultat = 10 / tal
    print(resultat)
except ValueError:
    print("Du måste skriva ett tal!")
except ZeroDivisionError:
    print("Du kan inte dividera med noll!")

Varje feltyp får ett eget tydligt meddelande.

Traceback

Python visar var felet finns

Traceback (most recent call last):
  File "program.py", line 3, in <module>
    resultat = 10 + "5"
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Traceback visar fil, radnummer, kodrad och feltyp.

Läs traceback

Börja längst ned

  1. Feltyp: TypeError.
  2. Förklaring: int och str kan inte adderas på detta sätt.
  3. Plats: program.py, rad 3.
  4. Kodrad: resultat = 10 + "5".

Felsökning

Arbeta systematiskt

  1. Läs feltypen och felmeddelandet.
  2. Gå till raden som traceback pekar på.
  3. Kontrollera värden och typer strax före felet.
  4. Testa en mindre del av programmet.
  5. Ändra en sak och kör igen.

print()

Se vad som händer före felet

print(f"tal = {tal}")
print(f"type(tal) = {type(tal)}")

resultat = 10 + tal

Tillfälliga utskrifter kan visa oväntade värden och typer.

Ta bort eller ersätt dem när felet är löst.

Öva själv

Åldersprogram

  1. Läs in användarens ålder.
  2. Omvandla svaret med int().
  3. Fånga ValueError.
  4. Kontrollera om åldern är negativ.
  5. Skriv ut ungefärligt födelseår för en giltig ålder.
  6. Testa med tal, text och ett negativt tal.

Sammanfattning

Kom ihåg

  • try innehåller kod som kan orsaka ett fel.
  • except hanterar en bestämd undantagstyp.
  • Olika fel kräver olika undantagstyper.
  • En traceback visar vad som gick fel och var.
  • Felsökning ska ske stegvis och systematiskt.