Python Prøv Unntatt: Forklart med eksempler

Python Try Except er en konstruksjon som brukes i Python for å håndtere unntak elegant uten å krasje.

Unntakshåndtering gjør programkoden mer pålitelig og mindre sannsynlighet for å mislykkes. Denne artikkelen veileder håndtering av unntak og vanlige scenarier der unntakshåndtering er ideell. Som en bonus vil vi også dekke hvordan du kan heve unntak.

Hva er unntakshåndtering?

Unntak er kritiske anomalier og feil som oppstår under et programs kjøring. Hvis de ikke håndteres, vil unntak krasje programmet. Derfor er unntakshåndtering en måte å håndtere unntak på for å sikre at de ikke krasjer programmet.

Her er et eksempel for å illustrere hva et unntak er.

user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)

Ved første øyekast ser det ut til at det ikke er noe galt med programmet ovenfor. Den mottar input fra brukeren og konverterer den til et heltall. Deretter viser den hele tallet gitt av brukeren doblet.

Programmet går fint hvis du kjører det med en inngangsverdi på 5. Se nedenfor.

Men anta at du kjørte det samme programmet igjen. Bare denne gangen, i stedet for å bruke 5 som input, skriver du inn strengen «hei». Programmet vil krasje. Strengen «hei» kan ikke konverteres til et heltall, så et unntak oppstår, og programmet krasjer.

Hvorfor tas det opp unntak og hvorfor bør du håndtere dem?

Unntak tas opp fordi vi ofte dekomponerer programmer til funksjoner når vi koder dem. Disse funksjonene kalles deretter for å utføre forskjellige oppgaver.

I eksemplet ovenfor kalte vi input-funksjonen for å motta brukerens input, deretter kalte vi int-funksjonen for å konvertere strenginndataene til et heltall, og til slutt kalte vi utskriftsfunksjonen for å vise noe utdata.

Men når funksjoner utfører handlingene sine, kan de støte på feil de ikke vet hvordan de skal håndtere. I dette tilfellet må nevnte funksjoner slutte å kjøre og kommunisere at det har oppstått en feil. For å kommunisere vil de ta opp unntak.

  Hvordan masselaster du ned bilder i nettleseren din

Koden som kalles funksjonen er ansvarlig for å lytte til disse unntakene og reagere riktig. Hvis dette ikke gjøres, vil programmet krasje etter å ha oppdaget feil, som vi så i det tidligere eksemplet.

Derfor er unntak i hovedsak en kommunikasjonsmekanisme som gjør at en funksjon som har blitt kalt kan sende et nødsignal til koden som kalte den. Og reaksjonen som er henvist til tidligere er essensen av unntakshåndtering.

Ulike typer unntak

Det er viktig å vite at ikke alle unntak er like. Det finnes ulike typer unntak for ulike feil som oppstår. For eksempel, hvis du prøver å dele et tall med null, oppstår en ZeroDivisionError. Og en TypeError oppstår når du prøver en operasjon med en ugyldig datatype. Her er en komplett liste over typer unntak.

Hvordan håndtere unntak

Som forklart tidligere er unntak nødsignaler laget av funksjoner vi kaller. Koden vår bør derfor lytte til disse nødsignalene og reagere riktig når de høres. For å håndtere unntak på riktig måte, bruker vi Python Try Except-konstruksjoner. Den grunnleggende strukturen for konstruksjonen er som følger:

try:
    # Code to try and run
except:
    # Code to run if an exception is raised
finally:
    # Code to run in the end, whether or not an exception is raised

Som du kan se, består konstruksjonen av tre nøkkelord som er forklart nedenfor:

prøve

Nøkkelordet try markerer begynnelsen på en Python Try Except-konstruksjon. I tillegg markerer det en kodeblokk som potensielt kan føre til et unntak. Det er en instruksjon til Python-tolken om å prøve å kjøre kode i blokken. Hvis et unntak oppstår, stopper programmet umiddelbart og hopper for å utføre koden som er skrevet inne i unntaksblokken.

unntatt

Nøkkelordet except markerer kodeblokken som vil bli utført hvis et unntak oppstår mens prøveblokken kjøres. Du kan definere flere unntatt blokker for forskjellige typer unntak som kan heves. Dette vil bli illustrert senere.

endelig

Det endelige nøkkelordet er det tredje og siste nøkkelordet som brukes i Python Try Except. Den markerer en kodeblokk som vil bli utført uansett om et unntak oppstår eller ikke.

Et eksempel

Her er et eksempel på hvordan søkeordene ovenfor kan håndtere et unntak. Vi vil modifisere det forrige eksemplet til dette.

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except:
    print("Something went wrong")
finally:
    print("This code will be executed no matter what")

Hvis du kjører koden ovenfor med 5, en gyldig inngang, som input, vil du få følgende:

  Slik starter du din egen spillserver

Og hvis du kjører den med «hei» som input, vil du få følgende:

Så da det ikke ble reist noe unntak mens koden ble kjørt i prøveblokken, gikk datamaskinen videre til den endelige blokken. Men når et unntak ble reist under utførelse av kode i try-blokken, flyttet datamaskinen til unntaksblokken og deretter den endelige blokken.

Du kan også håndtere unntak for spesifikke typer feil. For eksempel, hvis du vil håndtere ValueError og KeyboardInterrupt unntak på en bestemt måte, kan du endre koden ovenfor slik:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError:
    print("Value can't be converted to int")
except KeyboardInterrupt:
    print("Received a keyboard interrupt")
except:
    print("Catch-all exception block")
finally:
    print("This code will be executed no matter what")

I koden ovenfor har vi 3 unntatt blokker. Den første unntatt blokken fanger bare ValueError-unntak, mens den andre bare fanger KeyboardInterrupt-unntak. Den siste unntaksblokken har ikke en tilknyttet unntakstype å lytte etter. Som et resultat fanger den opp resten av unntakene som ikke fanges opp av de to første blokkene.

Når du kjører koden ovenfor, bør du få en utgang som ligner på dette:

Når et unntak reises, kan du få mer informasjon om unntaket i unntaksobjektet. For å få tilgang til unntaksobjektet bruker du som nøkkelord. Den brukes som følger:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError as e:
    print("Value Error:", e)
except KeyboardInterrupt as e:
    print("Keyboard Interrupt:", e)
except Exception as e:
    print("Some other exception", e)

Hvordan heve unntak

Til nå har vi hatt å gjøre med unntak som er reist av andre funksjoner. Det er imidlertid også mulig for deg å ta opp unntak i koden din. For å gjøre et unntak bruker vi søkeordet raise. Vi spesifiserer også en klasse som representerer hvilken type unntak vi ønsker å fremme og den menneskelesbare meldingen knyttet til unntaket.

Vi bruker Exception-klassen i følgende eksempel for å lage et generisk unntak. Deretter sender vi meldingen til klassens konstruktør.

raise Exception('Something went wrong')

Hvis du kjører kodebiten ovenfor som et program, får du utdata som ligner på dette:

  Fix App Plex TV kan ikke kobles til sikkert

Du kan også angi ulike typer unntak. Du kan for eksempel opprette et TypeError-unntak når en verdi har feil datatype:

def double(x):
    if isinstance(x, int):
        return x * 2
    else
        raise TypeError('x should be an int')

Eller hvis verdien som er spesifisert er utenfor de akseptable grensene, kan du øke en ValueError:

def say_hello(name):
    if name == '':
        raise ValueError('Value outside bounds')
    else:
        print('Hello', name)

Du kan også opprette unntakstyper ved å underklasse Unntaksklassen. Her er et eksempel:

class InvalidHTTPMethod(Exception):
    pass

I eksemplet ovenfor opprettet vi en klasse InvalidHTTPmethod, som arver fra Exception-klassen. Vi kan bruke det på samme måte som før for å gjøre unntak:

raise InvalidHTTPMethod('Must be GET or POST')

Vanlige brukstilfeller for unntakshåndtering

Unntakshåndtering brukes i mange scenarier. Det forrige eksemplet viste hvordan den kan håndtere unntak på grunn av brukerinndata. Denne delen vil dekke ytterligere to situasjoner der unntakshåndtering er nyttig. Disse håndterer unntak som følge av mislykkede nettverksforespørsler og håndterer unntak mens du leser filer.

Lage nettverksforespørsler

I eksemplet nedenfor sender vi en forespørsel til Google. Vi lytter etter unntak for å håndtere dem. Disse unntakene er definert i requests.exceptions-objektet.

import requests

try:
    response = requests.get("https://google.com")

    # Check if the response status code is in the 200-299 range (successful response)
    if 200 <= response.status_code < 300:
        print("Request was successful!")
    else:
        print(f"Request failed with status code: {response.status_code}")
except requests.exceptions.RequestException as e:
    print(f"RequestException occurred: {e}")
except requests.exceptions.ConnectionError as e:
    print(f"ConnectionError occurred: {e}")
except requests.exceptions.Timeout as e:
    print(f"Timeout occurred: {e}")
except requests.exceptions.TooManyRedirects as e:
    print(f"TooManyRedirects occurred: {e}")
except requests.exceptions.HTTPError as e:
    print(f"HTTPError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Lese data fra en fil

I dette siste eksemplet leser vi data fra hello.txt-filen. Vi håndterer også vanlige unntak som kan oppstå, for eksempel FileNotFound-feilen og IOError.

try:
    with open(file_path, 'r') as file:
        data = file.read()
        print("File contents:")
        print(data)
except FileNotFoundError as e:
    print(f"FileNotFoundError occurred: {e}")
except IOError as e:
    print(f"IOError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Konklusjon

Denne artikkelen undersøkte hva unntak var og hvorfor de ble tatt opp. Vi har også etablert at vi håndterer dem for å gjøre koden mer pålitelig og forhindre krasj. Til slutt dekket vi hvordan du håndterer unntak, samt hvordan du kan ta opp noen unntak.

Deretter kan du sjekke ut vanlige Python-feiltyper og hvordan du løser dem.