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.
FileNotFoundErrorZeroDivisionErrorTypeError
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
int("25")ger heltalet25.- Resten av
try-blocket körs. except-blocket hoppas över.
Du skrev: 25
Två flöden
När inmatningen är felaktig
Skriv ett heltal: hej
int("hej")orsakarValueError.- Resterande kod i
tryhoppas över. except ValueErrorkö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
- Feltyp:
TypeError. - Förklaring:
intochstrkan inte adderas på detta sätt. - Plats:
program.py, rad 3. - Kodrad:
resultat = 10 + "5".
Felsökning
Arbeta systematiskt
- Läs feltypen och felmeddelandet.
- Gå till raden som traceback pekar på.
- Kontrollera värden och typer strax före felet.
- Testa en mindre del av programmet.
- Ä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
- Läs in användarens ålder.
- Omvandla svaret med
int(). - Fånga
ValueError. - Kontrollera om åldern är negativ.
- Skriv ut ungefärligt födelseår för en giltig ålder.
- Testa med tal, text och ett negativt tal.
Sammanfattning
Kom ihåg
tryinnehåller kod som kan orsaka ett fel.excepthanterar 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.