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 try och except
  • förstå varför ValueError ofta 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

  1. try betyder: försök köra den här koden.
  2. Programmet frågar efter ålder och försöker göra om svaret till ett heltal.
  3. Om det fungerar körs print(age + 5).
  4. Om användaren skrev något som inte kan bli ett heltal uppstår ValueError.
  5. except ValueError få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

  1. while True gör att programmet fortsätter fråga.
  2. try-delen testar om inmatningen kan göras om till ett heltal.
  3. Om det fungerar skrivs resultatet ut.
  4. break avslutar loopen när programmet har fått ett giltigt värde.
  5. 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 + 5 och skriva hej
  • välja Ålder + 5 och skriva 17
  • välja 100 delat med tal och skriva 0
Tryck på Kör kod för att testa undantagshantering.

Programmering 2-koppling: här kombineras inmatning, typomvandling, villkor, loop och undantagshantering till ett mer stabilt program.

Öva själv

  1. Skriv ett program som frågar efter ett heltal och skriver ut talet gånger två.
  2. Lägg till try och except ValueError.
  3. Gör så att användaren får försöka igen tills ett giltigt heltal skrivs.
  4. 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 try och except göra ett program lättare att använda?

Tillbaka till Kapitel 1