PythonPodcast 9 - itnett/FTD02H-N GitHub Wiki

Episode 9 – Feilhåndtering og Unntaksbehandling i Python 🎧⚙️

Velkommen tilbake til episode 9 i vår Python-podcast! 🎉 I denne episoden skal vi snakke om feilhåndtering i Python, noe som er helt essensielt for å lage robuste programmer som ikke krasjer når det oppstår feil. Men før vi dykker dypere inn i dagens tema, la oss ta en rask oppsummering av hva vi har lært så langt.


Oppsummering av tidligere episoder:

  1. Grunnleggende Python-syntaks, variabler, og betingelser – Vi lærte hvordan vi kan bruke variabler og betingelser for å kontrollere flyten i koden.

  2. Løkker, input/output, og funksjoner – Vi så hvordan vi kan bruke løkker til å repetere kode, og hvordan vi tar input fra brukeren og skriver ut resultater.

  3. Feilhåndtering og bruk av lister, tupler, og ordbøker – Vi jobbet med ulike datastrukturer i Python, som er grunnlaget for å organisere data.

  4. Filbehandling – I forrige episode lærte vi hvordan vi kan lese og skrive til filer, og hvordan vi lagrer data utenfor programmet.


Dagens tema: Feilhåndtering og Unntaksbehandling 🔧

I programmering er det svært vanlig at ting ikke alltid går som planlagt. For eksempel kan en bruker skrive inn noe annet enn vi forventer, som tekst når vi venter et tall. Slike feil kan få programmet til å krasje hvis vi ikke håndterer dem på riktig måte. I Python bruker vi unntaksbehandling for å håndtere slike situasjoner på en kontrollert måte.

Unntaksbehandling i Python lar oss "fange" feil og reagere på dem på en fornuftig måte, slik at programmet ikke krasjer. Dette gjør vi ved hjelp av try, except, og til tider finally-blokkene.


Unntak og hva det betyr 🛠️

Et unntak er en feilsituasjon som kan oppstå under kjøring av et program. Hvis Python støter på et unntak, stopper programmet og gir oss en feilmelding. Ved hjelp av unntaksbehandling kan vi kontrollere hva som skjer i slike situasjoner, i stedet for at programmet stopper.

For eksempel, la oss si at vi prøver å dele et tall på 0. Dette vil vanligvis føre til en ZeroDivisionError, fordi det er matematisk umulig.

a = 5 b = 0 print(a / b) # Dette gir ZeroDivisionError

🔊 Les opp koden:

Linje 1: Vi definerer en variabel a med verdien 5.

Linje 2: Vi setter b til 0.

Linje 3: Vi prøver å dele a med b, noe som gir en feilmelding.


Hvordan bruker vi try og except i Python? 🛡️

Med try og except kan vi håndtere slike feil uten at programmet krasjer. La oss se på et eksempel der vi fanger opp denne feilen:

a = 5 b = 0

try: resultat = a / b except ZeroDivisionError: print("Feil: Du kan ikke dele på 0!")

🔊 Les opp koden:

Linje 1-2: Vi definerer to variabler, a og b.

Linje 4: Vi prøver å dele a på b, men siden vi har satt koden i en try-blokk, kan vi håndtere feilen uten at programmet stopper.

Linje 5: Vi bruker except for å fange opp feilen og skrive ut en melding i stedet.

Nå vil ikke programmet krasje hvis vi prøver å dele på null, men heller gi oss en melding om at det ikke er tillatt.


Flere unntakstyper og hvordan vi kan håndtere dem 🎯

Det finnes mange forskjellige typer unntak i Python. Her er noen vanlige typer unntak du kan støte på:

ValueError: Oppstår når en funksjon mottar en korrekt datatype, men med feil verdi.

TypeError: Oppstår når en operasjon brukes på inkompatible typer.

FileNotFoundError: Oppstår når du prøver å åpne en fil som ikke finnes.

La oss se hvordan vi kan håndtere flere typer unntak i samme program:

try: tall = int(input("Skriv inn et heltall: ")) resultat = 100 / tall print(f"Resultat: {resultat}") except ValueError: print("Feil: Du må skrive inn et heltall!") except ZeroDivisionError: print("Feil: Du kan ikke dele på 0!")

🔊 Les opp koden:

Linje 1: Vi setter opp en try-blokk hvor vi prøver å konvertere brukerens input til et heltall.

Linje 2: Vi prøver å dele 100 med tallet brukeren skrev inn.

Linje 5: Hvis brukeren ikke skriver inn et tall, vil vi få en ValueError og skrive ut en feilmelding.

Linje 7: Hvis brukeren skriver inn 0, vil vi få en ZeroDivisionError, og vi gir brukeren beskjed om at man ikke kan dele på 0.


Bruk av finally i Python 🎯

I tillegg til try og except, har vi også finally-blokken. Denne brukes hvis vi har kode som skal kjøres uansett om det oppstod en feil eller ikke. For eksempel, hvis vi åpner en fil, bør vi alltid sørge for å lukke den etterpå, uansett om det oppstår en feil.

Eksempel:

try: fil = open("data.txt", "r") innhold = fil.read() except FileNotFoundError: print("Filen ble ikke funnet!") finally: fil.close() print("Filen er lukket.")

🔊 Les opp koden:

Linje 1: Vi prøver å åpne en fil som heter "data.txt".

Linje 5: Hvis filen ikke finnes, vil vi få en FileNotFoundError og skrive ut en feilmelding.

Linje 8: Uansett om vi fikk en feil eller ikke, vil finally-blokken sørge for at filen lukkes.


Hvorfor er unntaksbehandling viktig? 💡

Unntaksbehandling er viktig for å lage programmer som er mer brukervennlige og som håndterer feil uten å krasje. Det gjør programmene våre mer pålitelige og fleksible, spesielt når de interagerer med brukere eller eksterne kilder, som filer eller nettverksressurser.


Avansert unntaksbehandling: Egendefinerte unntak 🎯

Noen ganger vil vi kanskje lage våre egne unntak for spesifikke situasjoner. Dette kan vi gjøre ved å definere en ny unntaksklasse som arver fra Python's innebygde Exception-klasse.

Eksempel:

class UgyldigAlderError(Exception): pass

def sjekk_alder(alder): if alder < 0: raise UgyldigAlderError("Alder kan ikke være negativ!") else: print("Alderen er gyldig.")

🔊 Les opp koden:

Linje 1: Vi lager en egendefinert unntaksklasse kalt UgyldigAlderError.

Linje 4: Funksjonen sjekk_alder() hever et unntak hvis alderen er mindre enn 0.


Oppsummering av Episode 9:

Vi har lært om unntaksbehandling ved hjelp av try, except, og finally.

Vi har sett hvordan vi kan håndtere spesifikke feil som ZeroDivisionError og ValueError.

Vi har lært om egendefinerte unntak for mer spesifikk feilhåndtering.

Vi har brukt finally for å sikre at viktig opprydding alltid blir utført, uansett hva som skjer i koden.


Oppgaver til deg:

  1. Lag et program som tar inn brukerinput og håndterer minst tre ulike typer unntak (som ValueError, TypeError, og FileNotFoundError).

  2. Utvid et tidligere program du har skrevet, og legg til unntaksbehandling for å gjøre det mer robust.


I neste episode skal vi ta et dypdykk i testing og debugging i Python, hvor vi ser hvordan vi kan teste programmene våre for feil og bruke Pythons innebygde verktøy for debugging. Vi høres!