Kap 1.6
Undantagshantering
Vi lär program att hantera vanliga fel utan att krascha direkt.
Mål
Efter lektionen ska du kunna...
- förklara vad ett undantag är
- använda
tryochexcept - förstå när
ValueErroruppstår - låta användaren försöka igen efter fel inmatning
- bygga mer robusta program
Begrepp
Vad är ett undantag?
Ett undantag är ett fel som uppstår medan programmet körs.
Programmet kan ha korrekt syntax men ändå krascha vid körning.
Exempel: användaren skriver text där programmet väntar sig ett tal.
Utan hantering
Det här kan krascha
age = int(input("Hur gammal är du? "))
print(age + 5)
Det fungerar om användaren skriver ett heltal.
Men int("hej") fungerar inte.
Feltyp
ValueError
ValueError kan uppstå när värdet har fel form.
int("17") # fungerar
int("hej") # ValueError
Texten "hej" kan inte göras om till ett heltal.
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.")
Steg 1
try: försök köra koden
try:
age = int(input("Hur gammal är du? "))
print(age + 5)
Python försöker köra raderna i try-blocket.
Steg 2
När allt fungerar
input: 17
age = int("17")
print(age + 5)
"17" kan bli talet 17, så programmet skriver ut 22.
Steg 3
När ett fel uppstår
input: hej
age = int("hej")
Här uppstår ValueError.
except ValueError:
print("Du måste skriva ett heltal.")
except fångar felet och visar ett eget meddelande.
Precision
Fånga rätt fel
Skriv hellre except ValueError än bara except.
Då fångar du felet du faktiskt förväntar dig.
Annars kan du råka dölja andra buggar.
Problem
En felinmatning räcker inte
Om användaren skriver fel vill vi ofta fråga igen.
Då kombinerar vi undantagshantering med en loop.
Loopen fortsätter tills inmatningen är giltig.
Loop
Fråga tills det fungerar
while True:
try:
age = int(input("Hur gammal är du? "))
print(age + 5)
break
except ValueError:
print("Fel inmatning, försök igen.")
Stegvis
Loop med felhantering
while Truegör att programmet kan fråga igentrytestar om svaret kan bli ett heltal- om det fungerar körs
print(age + 5) breakavslutar loopen- vid fel körs
exceptoch loopen börjar om
Exempel
Två försök
Försök 1: hej → ValueError → "Fel inmatning"
Försök 2: 17 → fungerar → skriver ut 22
Programmet kraschar inte, utan ger användaren en ny chans.
Robusthet
Alla fel är inte undantag
Vissa värden är tekniskt giltiga men ändå problematiska.
Exempel: 0 är ett heltal.
Men du kan inte dela med 0.
Villkor + except
Hantera flera problem
while True:
try:
number = int(input("Skriv ett tal: "))
if number == 0:
print("Du kan inte dela med 0.")
else:
print(100 / number)
break
except ValueError:
print("Fel inmatning, försök igen.")
Flöde
Vad händer i robusta exemplet?
"hej"→ValueError→ fråga igen0→ inget undantag, men stoppas avif4→ skriver ut25.0och avslutar
Egen övning
Bygg trygg inmatning
- Fråga efter ett heltal.
- Skriv ut talet gånger två.
- Lägg till
tryochexcept ValueError. - Fråga igen tills ett giltigt heltal skrivs.
- Stoppa ett orimligt värde, till exempel negativ ålder.
Reflektion
Fundera
- Vad är skillnaden mellan syntaxfel och körningsfel?
- Varför är ett tydligt felmeddelande bättre än en krasch?
- När gör
try/exceptprogrammet lättare att använda?
Sammanfattning
Kom ihåg
- Undantag är fel som uppstår när programmet körs.
tryinnehåller kod som kan orsaka fel.except ValueErrorfångar misslyckad typomvandling.- En loop kan låta användaren försöka igen.
- Robusta program hanterar vanliga fel tydligt.