Programmering nivå 2

Kap 4.2 – Try/except och felsökning

Hantera fel och hitta buggar i din kod.

Mål med lektionen

När du har arbetat klart med denna lektion ska du:

  • Förstå varför fel uppstår i program.
  • Känna till vanliga undantag i Python.
  • Använda try/except för att fånga fel och fortsätta programflödet.
  • Skriva tydligare och mer felsäker kod.

Så här lär du dig bäst

För att förstå try/except måste du testa vad som händer när något går fel. Skriv kod som kraschar och se hur Python rapporterar felet. Använd sedan try/except för att hantera det. Arbeta med små exempel och koppla dem till tidigare uppgifter, till exempel fel vid filhantering eller felaktig inmatning från användaren.

Repetition och fördjupning

Du har redan mött try och except i kapitel 1.6. Där låg fokus på grunden: att fånga ValueError när användaren skriver fel typ av inmatning.

I detta kapitel repeterar vi grunden, men går vidare med fler vanliga feltyper och felsökning. Du får se hur samma idé används vid filhantering, division med noll och när du läser en traceback för att hitta var felet uppstod.

Centrala begrepp

  • undantag (exceptions) - Fel som uppstår när program körs, till exempel ValueError och FileNotFoundError.
  • try/except - Konstruktion som fångar fel utan att programmet kraschar.
  • felmeddelanden - Hjälper dig förstå vad som gick fel och var.

Innehåll och exempel

Exempel: konverteringsfel

try:
    tal = int(input("Skriv ett heltal: "))
    print(f"Du skrev: {tal}")
except ValueError:
    print("Fel: Du måste skriva ett heltal!")

ValueError kan uppstå när programmet försöker göra om en text till ett tal, men texten inte har rätt format.

Exempel: fil saknas

try:
    with open("saknas.txt", "r") as f:
        innehåll = f.read()
except FileNotFoundError:
    print("Filen hittades inte.")

Det här exemplet visar hur du fångar ett vanligt filfel när en fil inte finns. Då skriver programmet ut ett tydligt meddelande i stället för att krascha.

Exempel: generellt fel

try:
    tal = int(input("Skriv ett tal att dividera 10 med: "))
    resultat = 10 / tal
    print(f"Resultatet blir {resultat}")
except ZeroDivisionError:
    print("Du kan inte dividera med noll!")

Om användaren skriver till exempel 2 fungerar programmet och skriver ut resultatet 5.0. Om användaren skriver 0 fångas felet av except och programmet visar ett tydligt felmeddelande i stället för att krascha.

Interaktiv övning: fånga olika fel

Välj exempel och kör koden. Övningen visar vilken rad som orsakar felet och vilket except-block som fångar det.

Välj ett exempel och tryck på Kör exempel.

Programmering 2-koppling: olika fel kräver olika undantagstyper. FileNotFoundError passar när en fil saknas. ZeroDivisionError passar när programmet försöker dividera med noll.

Felsökning

När ett fel uppstår visar Python ett spår, en traceback, som berättar vilken typ av fel som inträffade, var i koden felet uppstod och vilken kodrad som orsakade felet.

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Det betyder att programmet försökte addera ett heltal och en text, vilket inte går.

Tips för bättre felsökning

  • Lägg till tydliga felmeddelanden i except.
  • Använd print() för att spåra vad som händer före felet.
  • Testa delar av programmet i taget.
  • Kommentera kodstycken om du inte vet var felet ligger.

Öva själv

Övning 1: Säker heltalsinmatning

Fråga efter ett heltal och försök omvandla svaret med int(). Fånga ValueError och visa ett tydligt felmeddelande om användaren skriver något annat.

Testa: ett heltal, ett decimaltal och text.

När du har försökt själv: visa lösningsförslaget till övning 1 på GitHub.

Övning 2: Säker division

Fråga efter ett tal och dividera 100 med talet. Fånga ZeroDivisionError om talet är noll. Lägg även till ett separat except ValueError för felaktig talinmatning.

Fundera: Varför behövs två olika except-block?

När du har försökt själv: visa lösningsförslaget till övning 2 på GitHub.

Övning 3: Läs en fil som kanske saknas

Fråga användaren efter ett filnamn. Försök öppna filen med "r" och skriv ut innehållet. Fånga FileNotFoundError och skriv vilket filnamn som inte hittades.

Testa: en fil som finns och en som saknas.

När du har försökt själv: visa lösningsförslaget till övning 3 på GitHub.

Övning 4: Fråga tills åldern är giltig

Skriv funktionen read_age(). Den ska fortsätta fråga i en loop tills användaren skriver ett heltal mellan 0 och 120. Fånga ValueError och ge separata meddelanden för text och för tal utanför intervallet.

Fundera: Vilka fel fångas av except och vilka upptäcks med ett villkor?

När du har försökt själv: visa lösningsförslaget till övning 4 på GitHub.

Övning 5: Läs och summera tal från fil

Svårare övning: Här kombinerar du filhantering, listor, loopar och flera undantag.

Skapa en textfil med ett heltal på varje rad. Skriv en funktion som läser filen, omvandlar raderna till heltal och skriver ut summan. Hantera både FileNotFoundError och ValueError. Testa även en fil där en rad innehåller text.

Fundera: Vilken kodrad kan orsaka respektive fel?

När du har försökt själv: visa lösningsförslaget till övning 5 på GitHub.

Övning 6: Robust miniräknare

Svårare övning: Här kombinerar du funktioner, meny, loopar och flera sorters felhantering.

Bygg en miniräknare som frågar efter två decimaltal och ett av räknesätten +, -, * eller /. Hantera ValueError, division med noll och ogiltiga räknesätt. Programmet ska fortsätta tills användaren väljer att avsluta.

Fundera: Vilka problem är undantag och vilket är ett vanligt ogiltigt val?

När du har försökt själv: visa lösningsförslaget till övning 6 på GitHub.

Sammanfattning

  • Fel är en naturlig del av programmering - det viktiga är hur du hanterar dem.
  • Du kan använda try/except för att fånga fel och visa vänliga meddelanden.
  • Felsökning handlar om att förstå vad som händer i programmet och varför.

Tillbaka till Kapitel 4