Programmering nivå 2
Kap 1.6 – Undantagshantering
Lär dig hantera fel så att programmet kan fortsätta på ett kontrollerat sätt.
Mål med lektionen
När du har arbetat klart med denna lektion ska du:
- förstå vad ett undantag är
- kunna använda
tryochexcept - förstå varför
ValueErrorofta uppstår vid inmatning - kunna låta användaren försöka igen vid fel inmatning
- kunna bygga mer robusta program
Vad är ett undantag?
Ett undantag är ett fel som uppstår medan programmet körs. Det kan till exempel hända när användaren skriver text där programmet förväntar sig ett tal.
Utan undantagshantering avbryts programmet direkt. Med undantagshantering kan programmet fånga felet, visa ett begripligt meddelande och fortsätta.
Exempel utan undantagshantering
Det här programmet fungerar om användaren skriver ett heltal:
age = int(input("Hur gammal är du? "))
print(age + 5)
Men om användaren skriver hej kraschar programmet, eftersom int("hej") inte
går att göra om till ett heltal.
Exempel med try och except
try:
age = int(input("Hur gammal är du? "))
print(age + 5)
except ValueError:
print("Du måste skriva ett heltal.")
Steg för steg
trybetyder: försök köra den här koden.- Programmet frågar efter ålder och försöker göra om svaret till ett heltal.
- Om det fungerar körs
print(age + 5). - Om användaren skrev något som inte kan bli ett heltal uppstår
ValueError. except ValueErrorfångar just det felet och skriver ut ett eget felmeddelande.
Varför skriver man vilken typ av fel som ska fångas?
Det är bättre att skriva except ValueError än bara except. Då fångar du det
fel du faktiskt förväntar dig, i stället för att råka dölja andra problem i koden.
Låta användaren försöka igen
Undantagshantering används ofta tillsammans med en loop. Då kan programmet fråga igen tills användaren skriver något giltigt.
while True:
try:
age = int(input("Hur gammal är du? "))
print(age + 5)
break
except ValueError:
print("Fel inmatning, försök igen.")
Steg för steg: loop med felhantering
while Truegör att programmet fortsätter fråga.try-delen testar om inmatningen kan göras om till ett heltal.- Om det fungerar skrivs resultatet ut.
breakavslutar loopen när programmet har fått ett giltigt värde.- Om inmatningen är fel körs
except, och loopen börjar sedan om.
Robusta program
Ett robust program klarar vanliga fel utan att krascha. Det betyder inte att programmet ignorerar fel, utan att det hanterar dem på ett tydligt sätt.
Här hanteras både fel datatyp och division med noll:
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.")
Interaktiv övning: undantagshantering
Testa hur programmet reagerar på giltig och ogiltig inmatning. Skriv till exempel
17, hej eller 0.
Prova till exempel att:
- välja
Ålder + 5och skrivahej - välja
Ålder + 5och skriva17 - välja
100 delat med taloch skriva0
Programmering 2-koppling: här kombineras inmatning, typomvandling, villkor, loop och undantagshantering till ett mer stabilt program.
Öva själv
- Skriv ett program som frågar efter ett heltal och skriver ut talet gånger två.
- Lägg till
tryochexcept ValueError. - Gör så att användaren får försöka igen tills ett giltigt heltal skrivs.
- Lägg till ett eget villkor som stoppar ett orimligt värde, till exempel negativ ålder.
När du har försökt själv kan du ladda ner ett lösningsförslag: kap1-6-undantag-losningsforslag.py
Reflektion
- Vad är skillnaden mellan ett syntaxfel och ett fel som uppstår när programmet körs?
- Varför är det bättre att ge användaren ett tydligt felmeddelande än att låta programmet krascha?
- När kan
tryochexceptgöra ett program lättare att använda?