Presentationer Slide 1/1

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 try och except
  • förstå när ValueError uppstå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 True gör att programmet kan fråga igen
  • try testar om svaret kan bli ett heltal
  • om det fungerar körs print(age + 5)
  • break avslutar loopen
  • vid fel körs except och 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 igen
  • 0 → inget undantag, men stoppas av if
  • 4 → skriver ut 25.0 och avslutar

Egen övning

Bygg trygg inmatning

  1. Fråga efter ett heltal.
  2. Skriv ut talet gånger två.
  3. Lägg till try och except ValueError.
  4. Fråga igen tills ett giltigt heltal skrivs.
  5. 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/except programmet lättare att använda?

Sammanfattning

Kom ihåg

  • Undantag är fel som uppstår när programmet körs.
  • try innehåller kod som kan orsaka fel.
  • except ValueError fångar misslyckad typomvandling.
  • En loop kan låta användaren försöka igen.
  • Robusta program hanterar vanliga fel tydligt.