python try except python handling exception with examples
Ta vadnica razlaga ravnanje z izjemami v Pythonu z uporabo bloka Try Except s pomočjo programov:
Zaradi dveh vrst napak se program Python nenadoma ustavi, tj. Sintaksne napake , in Izjeme . V tej vadnici bomo razpravljali o drugi vrsti napak (izjeme) v okviru več pomembnih tem.
Veliko nam bo koristilo ravnanje z izjemami v naši aplikaciji, kot so:
- Ustvarjanje robustne aplikacije.
- Ustvarjanje čiste kode brez napak.
=> Obiščite tukaj za ekskluzivno serijo vadnic za Python
Kaj se boste naučili:
- Python Poskusite razen
- Pogoste izjeme Python
- Zaključek
Python Poskusite razen
Dobra novica je, da ima Python lepo število vgrajenih izjem, da lahko zazna napake v naši kodi. Prav tako nam daje priložnost, da ustvarimo izjeme po meri, kadar nobena vgrajena izjema ne ustreza našim potrebam.
Kaj je izjema
Kaj je torej izjema v Pythonu? No, poenostavljeno povedano, kadar koli tolmač Python poskuša izvesti neveljavno kodo, sproži izjemo in v primerih, ko s takšno izjemo ne ravnajo, moti običajni tok navodil programa in izpiše sledenje nazaj.
Ustvarimo neveljavno kodo in poglejmo, kako se bo odzval tolmač Python.
Odprite lupino Python in zaženite naslednjo kodo.
>>> 50/0
To je ena najpogostejših napak pri programiranju. Zgornja koda poskuša deliti številko petdeset avtor 0 (nič). Tolmač Python to vidi kot neveljavno operacijo in sproži a ZeroDivisionError , moti program in natisne sledenje nazaj.
To lahko jasno vidimo ZeroDivisionError je izjema, ki je bila postavljena. Resnično Pythonov način nam pove, da ni kul deliti število z ničlo. Čeprav v drugih jezikih, kot je JavaScript, to ni napaka; in python to prakso strogo prepoveduje.
Pomembno je tudi vedeti, da je to le izjema in da ima Python vgrajenih veliko takih predmetov. Oglejte si tega uradnika Pythona dokumentacijo da si ogledate vse vgrajene izjeme Python.
Razumevanje sledenja
Preden se lotimo obravnave izjem, mislim, da bo pomagalo razumeti, kaj natančno se bo zgodilo, če izjem ne bomo obravnavali in kako se Python po svojih najboljših močeh trudi, da nas obvesti o naši napaki.
Kadar Python naleti na napako, sproži izjemo. Če s to izjemo ne ravnamo, potem ustvari nekaj informacij, imenovanih Traceback. Torej, katere informacije vsebuje ta sled?
Vsebuje:
- Sporočilo o napaki, ki nam pove, katera izjema je bila sprožena in kaj se je zgodilo, preden je bila izjema sprožena.
- Različne številke vrstic kode, ki so povzročile to napako. Napako lahko povzroči zaporedje klicev funkcije, imenovano a klicni niz o katerem bomo razpravljali kasneje tukaj.
Čeprav je nekoliko zmedeno, obljubljamo, da bo naslednji primer vnesel več svetlobe v naše razumevanje.
Spomnimo se sledenja, ki je bilo natisnjeno z deljenja 50 z 0 zgoraj, lahko vidimo, da sledenje vsebuje naslednje informacije:
- Datoteka “”: To nam pove, da je bila ta koda zagnana s konzole.
- 1. vrstica: To nam pove, da je prišlo do napake pri tej številki vrstice.
- ZeroDivisionError: delitev po nič: Pove nam, kakšna izjema je bila postavljena in kaj jo je povzročila.
Poskusimo z drugim primerom in morda poglejmo, kako a klicni niz izgleda kot. Odprite urejevalnik, vnesite spodnjo kodo in shranite kot tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11
Odprite terminal v imeniku, kjer je ta datoteka najdena in zagnana.
python tracebackExp.py
Videli boste naslednje sledenje:
Zgornje sledenje se morda zdi zmedeno, v resnici pa ni. Pythonistas so pripravili najboljši način za branje sledenja, ki je iz od spodaj navzgor . Torej, uporabimo to modrost, da poskusimo razumeti, kaj ta sledenje ponuja.
- Najnižje je izjema, ki je bila postavljena in zakaj je bila postavljena.
- Ko se pomaknemo navzgor, dobimo ime datoteke tracebackExp .py, kjer je prišlo do te napake, izračun, ki je povzročil to napako, izračunaj = numb / div, funkcijski sklad2 in vrstico s številko povezave 6, kjer je bil ta izračun izveden.
- Ko se pomaknemo navzgor, vidimo, da je bila naša funkcija stack2 poklicana v funkciji stack1 v vrstici številka 3.
- Ko se pomaknemo na vrh, vidimo, da je bil funkcijski sklad1 poklican v vrstici številka 11.< modul > nam pove, da se datoteka izvaja.
Pogoste izjeme Python
Knjižnica Python definira strašno veliko vgrajenih izjem. Lahko preverite dokumentacijo Pythona ali pokličete vgrajeno lokalno () deluje kot spodaj:
>>> dir(locals()('__builtins__'))
Ne bomo poskušali obravnavati vseh teh izjem, vendar bomo videli nekaj pogostih izjem, na katere boste verjetno naleteli.
programska oprema za prenos video posnetkov
# 1) TypeError
Poviša se, kadar je operacija ali funkcija uporabljena za objekt neprimerne vrste.
Primer 1
Upoštevajte spodnji program. Vzame dividendo in delilec, nato izračuna in natisne rezultat delitve dividende z deliteljem.
def compute_division(): dividend = int(input('Enter the dividend: ')) # cast string to int divisor = input('Enter the divisor: ') # no casting # Compute division result = dividend/divisor # print result print('The result of {}/{} is: {}'.format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division()
Od uporabnika zahtevamo vrednost dividende in delilnika, vendar pozabimo uvrstiti vrednost niza delitelja v celo število. Torej dobimo vrsto dividende celo število ( int ) in vrsta delitelja, ki je niz ( str ). Nato dobimo TypeError ker operater delitve (/) ne deluje na nizih.
Morda vas bo zanimalo, da ima Javascript za razliko od Pythona Type Type Prisila, ki v bistvu pretvori enega od vrst operanda v enakovredno vrednost tipa drugega operanda, če so operandi različnih vrst.
# 2) ValueError
To se sproži, ko operacija ali funkcija prejme argument, ki ima pravi tip, vendar neprimerno vrednost.
2. primer
Upoštevajte naš program v Primer 1 zgoraj.
Če uporabnik za dividendo vnese alfanumerično vrednost, kot je »3a«, bo naš program sprožil izjemo ValueError. To pa zato, ker Python int () metoda sprejme katero koli število ali niz in vrne celoštevilski objekt, vrednost niza ne sme vsebovati črk ali nobene številčne vrednosti.
# 3) AttributeError
Ta izjema se pojavi pri dodeljevanju ali sklicevanju na atribut, ki ne obstaja.
3. primer
Razmislite o spodnjem programu. Vnese število in izračuna kvadratni koren z uporabo Python matematični modul
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input('Compute Square root of: ')) # call function to compute square root
Ko uporabnik vnese številko, naš program poskuša uporabiti funkcijo iz matematičnega modula za izračun njenega kvadratnega korena, a prav tu smo naredili napako. Namesto sqrt smo pomotoma vtipkali sqr, ki ne obstaja v matematičnem modulu.
Torej, poskušali smo se sklicevati na atribut sqr, ki ne obstaja, in privedli do dviga izjeme AttributeError. Večina nas veliko dela tovrstne napake. Torej niste sami.
Obravnavanje izjem z poskusom razen
Kot programer bomo večino časa porabili za pisanje robustne kode, ki je prožna. Koda, ki se ne zlomi zaradi nekaterih napak. V Pythonu lahko to dosežemo tako, da svoje izjave zapremo v a poskusite - razen izjavo.
Izjava Python Try-Except
Stavek try-osim ima naslednjo strukturo:
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here
Priložimo kodo v tracebackExp .py znotraj stavka try-osim.
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print('program continuous') # 15
Zagon te kode bo ustvaril rezultat
Tako deluje izjava try-osim. Python izvrši kodo v poskusnem bloku vrstica 7-8 . Če ni najdena nobena neveljavna koda, potem koda v bloku razen 10. vrstica preskoči in izvedba se nadaljuje.
Če pa najdemo neveljavno kodo, se izvršitev takoj ustavi v bloku try in preveri, ali se izjema ujema s tisto, ki smo jo navedli v stavku освен vrstica 9 . Če se ujema, se blok razen izvede in nadaljuje. Če se ne, bo program prekinil.
Blok poskus ponavadi vsebuje kodo, ki lahko povzroči izjemo, medtem ko blok razen ujame in obravnava izjemo.
Obravnava več izjem z
Lahko obravnavamo več izjem z enim samim „razen“ ali več „izjemnimi“. Vse je odvisno od tega, kako želite obvladati vsako izjemo.
# 1) Obravnava več izjem z eno samo
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here
Ta metoda se uporablja, kadar sumimo, da lahko naša koda povzroča različne izjeme in želimo v vsakem primeru ukrepati enako. Torej, če tolmač Python najde ujemanje, se bo izvedla koda, zapisana v bloku razen.
Oglejmo si spodnji primer kode Python
najboljši brezplačni pop up blokator krom
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except (IndexError, ZeroDivisionError) as ex: print(ex)
Imamo dve možni izjemi, ki bi ju lahko navedli tukaj, ZeroDivisionError in IndexError . Če se pojavi katera od teh izjem, se izvede blok razen.
V zgornji kodi je idx = 3, torej idx_ vrednost postane 0 in vrednost / idx_ vrednost bo dvignil ZeroDivisionError
# 2) Obravnava več izjem z več izjemami
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Če bi radi raje obravnavali vsako izjemo posebej, potem lahko to storite tako.
Razmislite o spodnjem primeru kode Python
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except IndexError: print('idx of {} is out of range'.format(idx)) except ZeroDivisionError: print('arr({}) is 0. Hence, can't divide by zero'.format(idx)) except Exception as ex: print(ex) print('Not sure what happened so not safe to continue, app will be interrupted') raise ex
Tu opažamo, da je bila izjema uporabljena v zadnji stavki razen. Razlog za to je, da se izjema objekta Exception ujema z izjemo. Iz tega razloga mora biti vedno zadnji, saj bo Python prenehal preverjati druge obdelovalce izjem, ko se ena ujema.
V zgornji kodi je idx = 5 , torej arr (idx) bo dvignil IndexError Ker idx je večja od dolžine seznama arr
Prav tako nisem prepričan, kakšno izjemo je sprožila vaša aplikacija, in nikoli ni varno nadaljevati izvajanje. Zato imamo tip Izjema, da ujamemo vse nepredvidene izjeme. Nato uporabnika obvestimo in prekličemo aplikacijo z uveljavitvijo iste izjeme.
Preizkusite Else Statement
To je neobvezna funkcija izjemnega ravnanja in vam omogoča, da dodate kodo, ki jo želite zagnati, ko ni prišlo do napak. Če pride do napake, se blok else ne bo zagnal.
Oglejte si spodnji primer kode Python, odprite urejevalnik in shranite kodo kot elseTry.py
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input('Enter a divisor: ')) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print('Input can't be zero and should be a valid literal for int(). Please, try again!') else: print('Value: ', value) break
Uporabnik dobi vnos in ga uporabi za delitev 1. Tu imamo dve možni izjemi, neveljaven vnos uporabnika, ki bo povzročil ValueError in a nič (0) kar bo povzročilo ZeroDivisionError . Naša izjava razen obravnava te napake.
Zdaj želimo izpisati vrednost vrednost . Naš else-block poskrbi, da je natisnjen le, če se naš poskusni blok izvede brez napake. To je pomembno, kajti če pride do napake v našem poskusnem bloku, se vrednost bo nedoločen. Torej, dostop do njega bo povzročil še eno napako.
Zgornjo kodo zaženite s Python elseTry.py
Zgornji izhod kaže, da smo za prvi vnos vtipkali 0 in pritisnite ENTER. Ker je naš delilec prejel 0, 1 / delilec dvignjen zeroDivisionError . Naš drugi vnos je bil k, ki ni veljaven za int (), torej izjema ValueError se dvigne.
Toda naš zadnji vnos je bil 9, ki je veljaven in posledično smo dobili vrednost ' vrednost ”Natisnjeno kot 0,1111111111111111
Poskusite končno izjavo
To je tudi neobvezna funkcija obdelave izjem in se bo vedno zagnal, ne glede na to, kaj se zgodi v upravljavcih izjem.
To je:
- Ne glede na to, ali pride do izjeme ali ne
- Tudi če je v drugih blokih poklican 'return'.
- Tudi če je skript končan v drugih blokih
Torej, če imamo kodo, ki jo želimo zagnati v vseh situacijah, je na koncu blok naš fant. Ta blok se večinoma uporablja za čiščenje, kot je zapiranje datotek.
Razmislite o spodnjem primeru kode Python
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print('Cleaning...') openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Ta koda poskuša odpreti in prebrati datoteko text.txt v svojem trenutnem imeniku. Če datoteka obstaja, bo naš program natisnil prvo vrstico datoteke, nato pa se bo naš končni blok zagnal in datoteko zaprl.
Recimo, da imamo v imeniku, kjer je ta programska datoteka, datoteko z imenom text.txt in vsebuje Hello. Če zaženemo program, bomo imeli rezultate
Ta primer je bil izbran namerno, ker sem želel, da odpravimo majhno težavo, ki se lahko pojavi pri zapiranju datotek v končnem bloku.
Če datoteka ne obstaja, izjema FileNotFoundError bo povišana in spremenljivka Odpri datoteko ne bo definirano in ne bo datotečni objekt. Zato bo poskus zapiranja v končnem bloku povzročil izjemo UnboundLocalError ki je podrazred NameError .
To v bistvu pomeni, da se skušamo sklicevati na spremenljivko Odpri datoteko preden je bila dodeljena.
Majhen trik je v tem, da uporabimo obdelovalce izjem v zadnjem bloku.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print('Cleaning...') openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath)
Če naš poskusni blok dvigne FileNotFoundError, bomo imeli naslednji izhod
Dvignite izjemo
Dobra novica o izjemah Pythona je, da jih lahko namerno dvignemo. Izjeme nastanejo pri dvig izjave .
Stavek raise ima naslednjo sintakso:
raise (ExceptionName((*args: Object)))
Odprite terminal in dvignite kateri koli izjemen predmet iz Izjeme, vgrajene v Python. Na primer, če dvignemo ZeroDivisionError:
>>> raise ZeroDivisionError('Can't divide by zero')
Dobili bomo sledenje:
Zakaj je torej pomembno ustvarjati izjeme?
- Pri delu z izjemami po meri.
- Med preverjanjem zdravstvenega stanja.
Razredi po meri po meri
Izjema po meri je tista, ki jo ustvarite za obdelavo napak, ki so specifične za vaše potrebe. Trik je v tem, da definiramo razred, ki izhaja iz predmeta Izjema , nato z uporabo stavka raise dvignemo svoj razred izjem.
Recimo, da želimo preveriti uporabniški vnos in se prepričati, da vhodna vrednost ni negativna (preverjanje razumnosti). Seveda bi lahko sprožili izjemo Python ValueError, vendar bi radi napako prilagodili tako, da ji damo posebno in samo po sebi razumljivo ime, na primer InputIsNegativeError . Toda ta izjema ni vgrajena izjema v Pythonu.
Torej najprej ustvarimo svoj osnovni razred, ki bo izhajal iz izjem.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass
Nato ustvarimo razred izjem, ki bo podedoval osnovni razred in obravnaval našo specifično napako.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass
Preizkusimo to
try: value = int(input()) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
Zgornja zahteva za kodo za vnos uporabnika in preverite, ali je negativna. Če je res, bo povzročil našo izjemo po meri InputIsNegativeError, ki je pozneje ujeta v stavku osim.
Spodaj je celotna koda:
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass if __name__ == '__main__': try: value = int(input('Input a number: ')) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative')
Če je vhodna vrednost negativno število, kot je -1, bomo imeli izhod:
Oglejte si Python doc za več podrobnosti o izjemah po meri Python.
Pogosto zastavljena vprašanja
V # 1) Kako Python obravnava izjemo?
Odgovor: Python obravnava izjeme z uporabo izjava »poskusi razen« . Koda, ki lahko povzroči izjemo, se postavi in izvede v poskusite blokirati medtem ko razen bloka vsebuje kodo, ki bo obravnavala izjeme, če se pojavijo.
V # 2) Kaj povzroča izjemo v Pythonu?
Odgovor: Kadar tolmač Python naleti na neveljavno kodo, sproži izjemo, kar je Pythonov način, da nam sporoči, da se je zgodilo nekaj nepričakovanega. Izjeme lahko tudi namerno povečamo z uporabo dvig izjave .
V # 3) Kako Python obravnava več izjem?
Odgovor: Python obravnava več izjem z uporabo enega samega bloka ali več razen blokov.
Za en blok se izjeme posredujejo kot sklop: razen (Exception1, Exception2, .., ExceptionN) in Python preverja ujemanje od desne proti levi. V tem primeru se za vsako izjemo izvede enak postopek.
top 10 glasba downloader za android
Drug način, kako ujeti vse izjeme, je, da za izjemo ključne besede izpustite ime izjeme.
except: # handle all exceptions here
Drugi način je uporaba bloka razen za vsako izjemo:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
Tako lahko za vsako izjemo izvedete ločena dejanja.
V # 4) Zakaj je v Pythonu pomembno ravnanje z izjemami?
Odgovor: Prednost obravnavanja izjem v Pythonu je ta, da lahko ustvarimo robustne, čiste in brez napak aplikacije. Zaradi nekaterih napak ne bomo želeli, da bi se nam produkcijska koda zrušila, zato rešujemo napake in redno izvajamo delovanje naše aplikacije.
V # 5) Kako prezrete izjemo v Pythonu?
Odgovor: Če želite prezreti izjemo v Pythonu, uporabite podajo ključna beseda v bloku. Recimo, da želimo prezreti izjemo ValueError. To bomo storili tako:
except ValueError: pass
Če ne veste, kaj počnete, je zanemarjanje izjem neprimerno. Uporabnika vsaj obvestite o vseh morebitnih napakah.
Zaključek
V tej vadnici smo obravnavali: izjeme Python, sledenje; kako ravnati z izjemami z Poskusi / Razen / Drugače / Končno blokov, kako Dvignite Izjeme in končno, kako ustvariti lastne izjeme po meri.
Hvala za branje!
=> Obiščite tukaj, če se želite naučiti Pythona iz nič.
Priporočeno branje
- Vadnica za Python za začetnike (praktično BREZPLAČNO usposabljanje za Python)
- Izjave o nadzoru Pythona (Python Continue, Break and Pass)
- Vadnica Python DateTime s primeri
- Funkcije niza Python
- Python spremenljivke
- Vadnica za ravnanje z izjemami C # s primeri kode
- Popoln vodnik za ravnanje z izjemami PL SQL s primeri
- Java izjeme in obravnava izjem z primeri