Du lager en kalkulator der brukeren skriver inn to tall, og programmet deler det ene på det andre. Alt fungerer helt til noen skriver 0 som nevner. Da krasjer programmet med en ZeroDivisionError, og brukeren ser en lang feilmelding de ikke forstår. Try og except i Python lar deg fange slike feil og bestemme hva som skal skje i stedet for at programmet stopper.
Slik fungerer try og except
Du legger koden som kan feile inne i en try-blokk. Går noe galt, hopper Python til except-blokken:
def divider(x, y):
try:
resultat = x / y
return resultat
except ZeroDivisionError:
print("Kan ikke dele på null")
return None
Kaller du divider(10, 2), returnerer den 5.0. Kaller du divider(10, 0), printer den "Kan ikke dele på null" og returnerer None. Programmet krasjer ikke.
Legg merke til at except fanger en spesifikk feiltype: ZeroDivisionError. Du forteller Python nøyaktig hvilken feil du forventer. Det er bevisst.
Alltid fang spesifikke feiltyper
Du kan skrive except: uten feiltype, og den fanger alt. Men det skjuler feil du ikke forventet, som skrivefeil i variabelnavn eller feil datatyper. Disse vil du vite om, ikke gjemme bort.
Her er de vanligste feiltypene du vil møte:
- ValueError oppstår når en funksjon får riktig type, men feil verdi (f.eks. int("abc"))
- TypeError oppstår når du bruker feil type (f.eks. "tekst" + 5)
- ZeroDivisionError oppstår ved divisjon med null
- KeyError oppstår når du slår opp en nøkkel som ikke finnes i en dictionary
- IndexError oppstår når du henter et element utenfor en listes rekkevidde
- FileNotFoundError oppstår når du prøver å åpne en fil som ikke eksisterer
Du kan fange flere typer i samme try-blokk med separate except-linjer, eller kombinere dem: except (ValueError, TypeError):.
Bruk feilmeldingen i except
Vil du vite hva feilen sa, kan du fange den i en variabel med as:
try:
tall = int(input("Skriv et tall: "))
except ValueError as e:
print(f"Ugyldig input: {e}")
Skriver brukeren "abc", blir meldingen: "Ugyldig input: invalid literal for int() with base 10: 'abc'". Du ser nøyaktig hva som gikk galt, og brukeren får en forklaring i stedet for en krasj.
Try except i en løkke for gjentatte forsøk
Kombinerer du try except med en while-løkke, kan du be brukeren prøve igjen til de skriver noe gyldig:
gyldig = False
while not gyldig:
try:
tall = int(input("Skriv et tall: "))
gyldig = True
except ValueError as e:
print(f"Ugyldig: {e}. Prøv igjen.")
Skriver brukeren "hei", fanger except feilen, printer meldingen, og løkken kjører på nytt. Skriver brukeren et gyldig tall, settes gyldig til True, og løkken avslutter. Legg merke til at gyldig = True bare kjører hvis int()-konverteringen lykkes. Feiler den, hopper Python direkte til except.
else kjører bare når alt gikk bra
Python har en else-blokk for try som kjører kun når ingen feil oppstod:
try:
tall = int(input("Skriv et tall: "))
except ValueError:
print("Ugyldig tall")
else:
print(f"Du skrev {tall}")
Fordelen er tydelig: koden i else kan ikke utløse feilen du fanger. Hadde du lagt print-setningen inne i try, ville en uventet feil der også blitt fanget. else holder try-blokken liten og presis.
finally kjører uansett
finally-blokken kjører alltid, enten try lyktes eller except tok over:
try:
fil = open("data.txt")
innhold = fil.read()
except FileNotFoundError:
print("Filen finnes ikke")
finally:
print("Ferdig med filforsøk")
Typisk bruk er opprydding: lukke filer, avslutte databasetilkoblinger, eller logge at en operasjon ble forsøkt. finally kjører selv om du har en return-setning i try eller except.
Utløs egne feil med raise
Noen ganger vil du selv stoppe programmet med en feilmelding. Da bruker du raise:
def sett_alder(alder):
if alder < 0:
raise ValueError("Alder kan ikke være negativ")
return alder
Kaller du sett_alder(-5), får du en ValueError med meldingen du skrev. Dette er nyttig for å validere input tidlig i programmet, slik at feil ikke sniker seg gjennom til et punkt der de er vanskeligere å spore.
Den som kaller funksjonen kan fange feilen med try/except og håndtere den:
try:
bruker_alder = sett_alder(-5)
except ValueError as e:
print(f"Feil: {e}")
Kombinasjonen av raise og try/except gir deg full kontroll: funksjonen sjekker og varsler, og koden som kaller den bestemmer hva som skal skje.
Ikke bruk try except for alt
Det er fristende å pakke inn all kode i try/except-blokker. Motstå fristelsen. Feilhåndtering bør brukes for situasjoner du ikke kan kontrollere, som brukerinput, nettverkskall og filtilgang.
Kan du sjekke betingelsen på forhånd, gjør det. Å sjekke om en fil eksisterer før du åpner den er ofte bedre enn å fange en FileNotFoundError. Try/except er riktig verktøy når sjekken er upålitelig (filen kan forsvinne mellom sjekk og åpning) eller når det finnes mange mulige feil.
Neste steg
Nå som du kan bruke try og except i Python, har du grunnlaget for robust feilhåndtering. For å forstå mer om hvordan funksjoner i Python fungerer generelt, starter du der. Vil du sende inn et fleksibelt antall argumenter med *args og **kwargs, bygger du videre på det du allerede kan. Du finner også en komplett liste over innebygde feiltyper i Python-dokumentasjonen.
Denne videoen er hentet fra kurset Python for nybegynnere på Utdannet.no. I det fulle kurset lærer du også filhåndtering, objektorientert programmering og testing av koden din.




