Presentationer Slide 1/1

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 try och except
  • 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

  1. Fel input ger ValueError.
  2. except visar meddelandet.
  3. Nästa loopvarv frågar igen.
  4. Giltig input når break.
  5. 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)
  • hej ger ValueError.
  • 0 ger ZeroDivisionError.

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?

Terminal och kodväg
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

InputResultatNästa steg
hejValueError fångasfråga igen
0ZeroDivisionError fångasfråga igen
425.0break

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

TestFörväntat
4resultat 25.0
0meddelande om noll
hejmeddelande om heltal
tom inputmeddelande om heltal

10.4 · Övning

Giltigt positivt tal

  1. Fråga efter ett tal i en loop.
  2. Fånga misslyckad heltalsomvandling.
  3. Kontrollera att talet är större än 0.
  4. Skriv ut talet gånger 5.
  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.
  • try innehåller operationen som kan misslyckas.
  • except hanterar 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.