Python-unntakshåndtering
Vi har utforsket grunnleggende python til nå fra sett 1 til 4 ( Sett 1 | Sett 2 | Sett 3 | Sett 4 ).
I denne artikkelen vil vi diskutere hvordan du håndterer unntak i Python ved å bruke try, except, og til slutt uttalelser ved hjelp av riktige eksempler.
Feil i Python kan være av to typer, dvs. Syntaksfeil og unntak . Feil er problemer i et program som gjør at programmet stopper kjøringen. På den annen side oppstår unntak når noen interne hendelser oppstår som endrer den normale flyten i programmet.
Ulike typer unntak i python:
I Python er det flere innebygde Python-unntak som kan oppstå når det oppstår en feil under kjøringen av et program. Her er noen av de vanligste typene unntak i Python:
- Syntaksfeil: Dette unntaket oppstår når tolken støter på en syntaksfeil i koden, for eksempel et feilstavet nøkkelord, et manglende kolon eller en ubalansert parentes.
- TypeError : Dette unntaket oppstår når en operasjon eller funksjon brukes på et objekt av feil type, for eksempel å legge til en streng til et heltall.
- Navnefeil : Dette unntaket oppstår når et variabel- eller funksjonsnavn ikke finnes i gjeldende omfang.
- Indeksfeil : Dette unntaket økes når en indeks er utenfor rekkevidde for en liste, tuppel eller andre sekvenstyper.
- KeyError : Dette unntaket oppstår når en nøkkel ikke finnes i en ordbok.
- ValueError : Dette unntaket oppstår når en funksjon eller metode kalles med et ugyldig argument eller inndata, for eksempel å prøve å konvertere en streng til et heltall når strengen ikke representerer et gyldig heltall.
- AttributeError : Dette unntaket oppstår når et attributt eller en metode ikke finnes på et objekt, for eksempel forsøk på å få tilgang til et ikke-eksisterende attributt til en klasseforekomst.
- IOFeil : Dette unntaket oppstår når en I/O-operasjon, som å lese eller skrive en fil, mislykkes på grunn av en inn-/utdatafeil.
- ZeroDivisionError : Dette unntaket økes når det gjøres et forsøk på å dele et tall med null.
- Importerror : Dette unntaket oppstår når en importsetning ikke klarer å finne eller laste en modul.
Dette er bare noen få eksempler på de mange typene unntak som kan forekomme i Python. Det er viktig å håndtere unntak riktig i koden din ved å bruke prøve-unntatt-blokker eller andre feilhåndteringsteknikker, for å behandle feil på en elegant måte og forhindre at programmet krasjer.
Forskjellen mellom syntaksfeil og unntak
Syntaksfeil: Som navnet antyder er denne feilen forårsaket av feil syntaks i koden. Det fører til avslutning av programmet.
Eksempel:
Det er en syntaksfeil i koden. De ' if'> setningen skal etterfølges av et kolon ( :> ), og ' print'> setningen skal være innrykket for å være inne i ' if'> blokkere.
Python3
amount> => 10000> if> (amount>> 2999> )> print> (> 'You are eligible to purchase Dsa Self Paced'> )> |
Produksjon:
Unntak: Unntak gjøres når programmet er syntaktisk korrekt, men koden resulterer i en feil. Denne feilen stopper ikke kjøringen av programmet, men den endrer den normale flyten av programmet.
Eksempel:
Her i denne koden deler vi 'merker' med null slik at det oppstår en feil kjent som 'ZeroDivisionError'
Python3
marks> => 10000> a> => marks> /> 0> print> (a)> |
Produksjon:
I eksemplet ovenfor hevet ZeroDivisionError da vi prøver å dele et tall med 0.
Merk: Unntak er basisklassen for alle unntakene i Python. Du kan sjekke unntakshierarkiet her .
Eksempel:
1) TypeError: Dette unntaket oppstår når en operasjon eller funksjon brukes på et objekt av feil type. Her er et eksempel:
Her en 'TypeError' heves da begge datatypene er forskjellige som legges til.
Python3
x> => 5> y> => 'hello'> z> => x> +> y> |
output: Traceback (most recent call last): File '7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py', line 4, in z = x + y TypeError: unsupported operand type(s) for +: 'int' and 'str'
prøv catch block for å løse det:
Koden prøver å legge til et heltall ( ' x'> ) og en streng ( ' y'> ) sammen, som ikke er en gyldig operasjon, og det vil øke en ' TypeError'> . Koden brukte a ' try'> og ' except'> blokker for å fange dette unntaket og skrive ut en feilmelding.
Python3
x> => 5> y> => 'hello'> try> :> > z> => x> +> y> except> TypeError:> > print> (> 'Error: cannot add an int and a str'> )> |
Produksjon
Error: cannot add an int and a str
Prøv og unntatt-uttalelse – fanger unntak
Try and except-setninger brukes til å fange opp og håndtere unntak i Python. Utsagn som kan gi unntak holdes inne i try-leddet, og utsagn som håndterer unntaket er skrevet inne i except-leddet.
Eksempel: Her prøver vi å få tilgang til array-elementet hvis indeks er utenfor grensen og håndtere det tilsvarende unntaket.
Python3
a> => [> 1> ,> 2> ,> 3> ]> try> :> > print> (> 'Second element = %d'> %> (a[> 1> ]))> > print> (> 'Fourth element = %d'> %> (a[> 3> ]))> except> :> > print> (> 'An error occurred'> )> |
Produksjon
Second element = 2 An error occurred
I eksemplet ovenfor er setningene som kan forårsake feilen plassert i try-setningen (andre utskriftssetning i vårt tilfelle). Den andre utskriftssetningen prøver å få tilgang til det fjerde elementet i listen som ikke er der, og dette gir et unntak. Dette unntaket fanges da opp av unntaksutsagnet.
Spesifikt fangstunntak
En try-setning kan ha mer enn én unntatt-klausul, for å spesifisere behandlere for forskjellige unntak. Vær oppmerksom på at maksimalt én behandler vil bli utført. For eksempel kan vi legge til IndexError i koden ovenfor. Den generelle syntaksen for å legge til spesifikke unntak er -
try: # statement(s) except IndexError: # statement(s) except ValueError: # statement(s)
Eksempel: Fanger spesifikke unntak i Python
Koden definerer en funksjon ' fun(a)'> som beregner b> basert på innspillet a> . Hvis a> er mindre enn 4, prøver den å dele med null, noe som forårsaker a ' ZeroDivisionError'> . Koden ringer fun(3)> og fun(5)> inne i en prøve-unntatt blokk. Den håndterer ZeroDivisionError> til fun(3)> og utskrifter ZeroDivision Error oppstod og behandlet. De ' NameError'> blokk utføres ikke siden det ikke er noen ' NameError'> unntak i koden.
Python3
def> fun(a):> > if> a <> 4> :> > b> => a> /> (a> -> 3> )> > print> (> 'Value of b = '> , b)> > try> :> > fun(> 3> )> > fun(> 5> )> except> ZeroDivisionError:> > print> (> 'ZeroDivisionError Occurred and Handled'> )> except> NameError:> > print> (> 'NameError Occurred and Handled'> )> |
Produksjon
ZeroDivisionError Occurred and Handled
Hvis du kommenterer linjen moro(3), vil utgangen være
NameError Occurred and Handled
Utdataene ovenfor er slik fordi så snart python prøver å få tilgang til verdien av b, oppstår NameError.
Prøv med Else Clause
I Python kan du også bruke else-klausulen på try-except-blokken som må være til stede etter alle unntatt-klausulene. Koden går bare inn i else-blokken hvis try-leddet ikke gir et unntak.
Prøv med en annen klausul
Koden definerer en funksjon AbyB(a, b)> som beregner c> som ((a+b) / (a-b)) og håndterer et potensial ZeroDivisionError> . Den skriver ut resultatet hvis det ikke er noen divisjon med null feil. Ringer AbyB(2.0, 3.0)> beregner og skriver ut -5.0> , mens du ringer AbyB(3.0, 3.0)> prøver å dele på null, noe som resulterer i a ZeroDivisionError> , som er fanget og a/b gir 0 er skrevet ut.
Python3
def> AbyB(a , b):> > try> :> > c> => ((a> +> b)> /> (a> -> b))> > except> ZeroDivisionError:> > print> (> 'a/b result in 0'> )> > else> :> > print> (c)> AbyB(> 2.0> ,> 3.0> )> AbyB(> 3.0> ,> 3.0> )> |
Produksjon:
-5.0 a/b result in 0
Endelig nøkkelord i Python
Python gir et nøkkelord endelig , som alltid kjøres etter forsøket og unntatt blokker. Den siste blokken kjøres alltid etter normal avslutning av prøveblokken eller etter at prøveblokken avsluttes på grunn av et unntak.
Syntaks:
try: # Some Code.... except: # optional block # Handling of exception (if required) else: # execute if no exception finally: # Some code .....(always executed)
Eksempel:
Koden prøver å utføre heltallsdivisjon med null, noe som resulterer i en ZeroDivisionError> . Den fanger opp unntaket og skriver ut Kan ikke dele på null. Uavhengig av unntaket finally> blokken utføres og skrives ut Dette blir alltid utført.
Python3
try> :> > k> => 5> /> /> 0> > print> (k)> except> ZeroDivisionError:> > print> (> 'Can't divide by zero'> )> finally> :> > print> (> 'This is always executed'> )> |
Produksjon:
Can't divide by zero This is always executed
Unntak for heving
De heve uttalelse lar programmereren tvinge et spesifikt unntak til å skje. Det eneste argumentet i reisemålet indikerer unntaket som skal reises. Dette må enten være en unntaksforekomst eller en unntaksklasse (en klasse som stammer fra Exception).
Denne koden reiser med vilje en NameError> med meldingen Hei der bruker raise> uttalelse innenfor en try> blokkere. Deretter fanger den opp NameError> unntak, utskrifter Et unntak, og re-reiser det samme unntaket ved å bruke raise> . Dette demonstrerer hvordan unntak kan økes og håndteres i Python, noe som gir mulighet for tilpassede feilmeldinger og videre spredning av unntak.
Python3
try> :> > raise> NameError(> 'Hi there'> )> except> NameError:> > print> (> 'An exception'> )> > raise> |
Utdataene fra koden ovenfor vil ganske enkelt skrives ut som et unntak, men en Runtime-feil vil også oppstå i den siste på grunn av raise-setningen på den siste linjen. Så utdataene på kommandolinjen vil se ut
Traceback (most recent call last): File '/home/d6ec14ca595b97bff8d8034bbf212a9f.py', line 5, in raise NameError('Hi there') # Raise Error NameError: Hi there Fordeler med unntakshåndtering:
- Forbedret programpålitelighet : Ved å håndtere unntak riktig kan du forhindre at programmet krasjer eller gir feil resultater på grunn av uventede feil eller inndata.
- Forenklet feilhåndtering : Unntakshåndtering lar deg skille feilhåndteringskode fra hovedprogramlogikken, noe som gjør det enklere å lese og vedlikeholde koden.
- Rengjøringskode: Med unntakshåndtering kan du unngå å bruke komplekse betingede setninger for å se etter feil, noe som fører til renere og mer lesbar kode.
- Enklere feilsøking : Når et unntak oppstår, skriver Python-tolken ut en tilbakesporing som viser den nøyaktige plasseringen der unntaket skjedde, noe som gjør det enklere å feilsøke koden din.
Ulemper med unntakshåndtering:
- Ytelsesoverhead: Unntakshåndtering kan være tregere enn å bruke betingede setninger for å se etter feil, da tolken må utføre ekstra arbeid for å fange opp og håndtere unntaket.
- Økt kodekompleksitet : Unntakshåndtering kan gjøre koden mer kompleks, spesielt hvis du må håndtere flere typer unntak eller implementere kompleks feilhåndteringslogikk.
- Mulige sikkerhetsrisikoer: Feilhåndterte unntak kan potensielt avsløre sensitiv informasjon eller skape sikkerhetssårbarheter i koden din, så det er viktig å håndtere unntak forsiktig og unngå å avsløre for mye informasjon om programmet ditt.
Samlet sett oppveier fordelene med unntakshåndtering i Python ulempene, men det er viktig å bruke det fornuftig og forsiktig for å opprettholde kodekvalitet og programpålitelighet.
Denne artikkelen er bidratt av Nikhil Kumar Singh(nickzuck_007)