Kapitel 10
Undantagshantering
Fånga fel och låt programmet reagera kontrollerat.
Mål
Efter kapitlet ska du kunna...
- förklara vad ett undantag är
- använda
tryochexcept - hantera felaktig indata
- låta användaren försöka igen
- skilja på olika undantagstyper
- bygga robustare program
10.1
Ett undantag uppstår under körning
Programmet är syntaktiskt giltigt och startar.
Ett oväntat värde eller en otillåten operation gör att programmet inte kan fortsätta normalt.
Python skapar då ett undantag, exempelvis ValueError.
Utan hantering
Felaktig input kraschar programmet
age = int(input("Hur gammal är du? "))
print(age + 5)
Hur gammal är du? hej
ValueError: invalid literal for int()
with base 10: 'hej'
Med hantering
try och except
try:
age = int(input("Hur gammal är du? "))
print(age + 5)
except ValueError:
print("Du måste skriva ett heltal")
Programmet kraschar inte. Användaren får ett begripligt meddelande.
Grundstruktur
Försök – fånga – fortsätt
try:
kod som kan orsaka ett undantag
except Feltyp:
kod som hanterar felet
try-blocket körs först.
except-blocket körs bara om rätt feltyp uppstår.
Ingen felaktig input
except hoppas över
try:
age = int(input("Ålder: "))
print(age + 5)
except ValueError:
print("Fel inmatning")
Ålder: 16
21
Om try lyckas fortsätter programmet efter hela blocket.
När omvandlingen misslyckas
Python hoppar direkt till except
try:
age = int(input("Ålder: "))
print(age + 5)
except ValueError:
print("Fel inmatning")
Ålder: hej
Fel inmatning
Viktig princip
Fånga det fel du kan hantera
Otydligt
except:Fångar alla undantag och kan dölja programmeringsfel.
Tydligt
except ValueError:Fångar bara misslyckad värdeomvandling.
Kontrollfråga
Vilken gren körs?
try:
number = int("12")
print(number * 2)
except ValueError:
print("Fel")
Svar: omvandlingen lyckas och terminalen skriver 24.
10.2
Användaren kan skriva oväntade värden
- Text där programmet väntar sig ett tal.
- Tom inmatning.
- Ett tal i fel format.
- Ett värde utanför det tillåtna området.
Programmet måste avgöra vilka fall det kan hantera.
Försök igen
Kombinera loop och undantag
while True:
try:
age = int(input("Hur gammal är du? "))
print(age + 5)
break
except ValueError:
print("Fel inmatning, försök igen")
Loopen fortsätter tills omvandlingen lyckas.
Varför break?
Avsluta efter giltig input
- Fel input ger
ValueError. exceptvisar meddelandet.- Nästa loopvarv frågar igen.
- Giltig input når
break. - Loopen avslutas.
Exempel på körning
Två försök
Hur gammal är du? hej
Fel inmatning, försök igen
Hur gammal är du? 20
25
Det första försöket fångas. Det andra lyckas och avslutar loopen.
10.3
Ett robust program klarar oväntade situationer
- Det kontrollerar eller hanterar användarens input.
- Det ger tydliga meddelanden.
- Det kraschar inte vid förväntade fel.
- Det låter användaren rätta sitt misstag.
Inte robust
Två möjliga krascher
number = int(input("Skriv ett tal: "))
print(100 / number)
hejgerValueError.0gerZeroDivisionError.
Två undantagstyper
Hantera felen var för sig
try:
number = int(input("Skriv ett tal: "))
print(100 / number)
except ValueError:
print("Du måste skriva ett heltal")
except ZeroDivisionError:
print("Du kan inte dela med noll")
Varje fel får ett specifikt meddelande.
Interaktiv kontroll
Vilken gren körs?
Prova 4, 0 och hej.
Robust division · hela programmet
Fråga tills ett giltigt tal fungerar
while True:
try:
number = int(input("Skriv ett tal: "))
result = 100 / number
print(result)
break
except ValueError:
print("Du måste skriva ett heltal")
except ZeroDivisionError:
print("Du kan inte dela med noll")
Tre körvägar
Input avgör vad som händer
| Input | Resultat | Nästa steg |
|---|---|---|
hej | ValueError fångas | fråga igen |
0 | ZeroDivisionError fångas | fråga igen |
4 | 25.0 | break |
Undantag eller villkor?
Välj tydlig kontroll
try/except passar när en operation kan misslyckas, exempelvis int(text).
if passar när värdet enkelt kan kontrolleras före operationen.
if number == 0:
print("Du kan inte dela med noll")
else:
print(100 / number)
Validera också värdet
Rätt datatyp räcker inte alltid
while True:
try:
number = int(input("Skriv ett positivt tal: "))
if number > 0:
print(number * 5)
break
print("Talet måste vara större än 0")
except ValueError:
print("Du måste skriva ett heltal")
Bra felmeddelanden
Berätta vad användaren ska göra
Otydligt
Fel!Tydligt
Skriv ett heltal större än 0.Meddelandet bör förklara både problemet och nästa steg.
Testa felhanteringen
Varje väg behöver ett test
| Test | Förväntat |
|---|---|
4 | resultat 25.0 |
0 | meddelande om noll |
hej | meddelande om heltal |
| tom input | meddelande om heltal |
10.4 · Övning
Giltigt positivt tal
- Fråga efter ett tal i en loop.
- Fånga misslyckad heltalsomvandling.
- Kontrollera att talet är större än 0.
- Skriv ut talet gånger 5.
- Avsluta först när allt lyckas.
Övning
Dividera två tal robust
- Läs in två heltal.
- Hantera felaktig indata.
- Hantera division med noll.
- Ge specifika meddelanden.
- Testa en giltig division, text och noll.
Sammanfattning
Kom ihåg
- Ett undantag uppstår när något går fel under körning.
tryinnehåller operationen som kan misslyckas.excepthanterar en bestämd feltyp.- Fånga helst specifika undantag.
- En loop kan låta användaren försöka igen.
- Robusta program validerar värden, ger tydliga besked och testas på alla vägar.