python try except python handling exception with examples
Ovaj vodič objašnjava rukovanje iznimkama u Pythonu pomoću bloka Try Except uz pomoć primjera programiranja:
Dvije vrste pogrešaka mogu naglo zaustaviti program Python, tj. Sintaksne pogreške , i Iznimke . U ovom uputstvu raspravljat ćemo o drugoj vrsti pogreške (Iznimke) u nekoliko važnih tema.
Puno ćemo imati koristi od rukovanja iznimkama u našoj aplikaciji, kao što su:
- Stvaranje robusne aplikacije.
- Stvaranje čistog koda bez pogrešaka.
=> Posjetite ovdje za ekskluzivnu seriju vodiča za obuku za Python
Što ćete naučiti:
- Python Pokušaj osim
- Uobičajene iznimke Pythona
- Zaključak
Python Pokušaj osim
Jedna dobra vijest je da Python ima velik broj ugrađenih iznimaka za hvatanje pogrešaka u našem kodu. Također, daje nam mogućnost stvaranja prilagođenih iznimaka kada niti jedan ugrađeni izuzetak ne odgovara našim potrebama.
Što je iznimka
Pa, što je iznimka u Pythonu? Pa, jednostavnim riječima, kad god Python interpreter pokuša izvršiti nevaljani kôd, on pokreće iznimku, a u slučajevima kada takva iznimka nije obrađena, remeti normalan tijek uputa programa i ispisuje povratno praćenje.
Stvorimo nevaljani kôd i vidimo kako će Python tumač reagirati.
Otvorite Python ljusku i pokrenite sljedeći kod.
>>> 50/0
Ovo je jedna od najčešćih pogrešaka u programiranju. Gornji kod pokušava podijeliti broj pedeset po 0 (nula). Python tumač to vidi kao nevaljanu operaciju i podiže a ZeroDivisionError , ometa program i ispisuje povratni trag.
To jasno možemo vidjeti ZeroDivisionError je iznimka koja je podignuta. To je doista Pythonov način da nam kaže da nije u redu podijeliti broj s nulom. Iako na drugim jezicima poput JavaScript-a, ovo nije pogreška; a python strogo zabranjuje ovu praksu.
Također, važno je znati da je ovo samo objekt iznimke i Python ima ugrađene mnoge takve objekte. Pogledajte ovog službenika Pythona dokumentacija da biste vidjeli sve Python ugrađene iznimke.
Razumijevanje Tracebacka
Prije nego što se pozabavimo rješavanjem iznimki, mislim da će vam pomoći razumjeti što će se točno dogoditi ako se iznimke ne obrade i kako Python čini sve da nas obavijesti o našoj pogrešci.
Kad god Python naiđe na pogrešku, on pokreće iznimku. Ako se s ovom iznimkom ne postupi, tada se dobivaju neke informacije nazvane Traceback. Pa, koje informacije sadrži ovaj povrat podataka?
Sadrži:
- Poruka pogreške koja nam govori koja je iznimka pokrenuta i što se dogodilo prije pokretanja ove iznimke.
- Brojevi različitih redaka koda koji su uzrokovali ovu pogrešku. Pogrešku može uzrokovati slijed poziva funkcije koji se naziva a skup poziva o čemu ćemo kasnije ovdje.
Iako je pomalo zbunjujuće, obećavamo da će sljedeći primjer unijeti više svjetla u naše razumijevanje.
Sjetimo se povratne veze koja je ispisana s dijeljenja 50 s 0 gore, možemo vidjeti da povratna traga sadrži sljedeće informacije:
- Datoteka “”: Ovo nam govori da je ovaj kôd pokrenut s terminala konzole.
- redak 1: Ovo nam govori da se pogreška dogodila u ovom broju retka.
- ZeroDivisionError: podjela po nula: Govori nam koja je iznimka pokrenuta i što je uzrokovalo.
Pokušajmo s drugim primjerom i možda ćemo vidjeti kako a skup poziva izgleda kao. Otvorite uređivač, unesite donji kod i spremite kao 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
Otvorite terminal u direktoriju u kojem je pronađena i pokrenite ovu datoteku.
python tracebackExp.py
Vidjet ćete sljedeći povratni trag:
Gore navedeni trag možda djeluje zbunjujuće, ali stvarno nije. Pythonistas je smislio najbolji način za čitanje povratnih podataka, koji je iz odozdo prema gore . Dakle, iskoristimo ovu mudrost kako bismo pokušali shvatiti što ovaj povratni trag nudi.
- Na dnu, imamo iznimku koja je podignuta i zašto je podignuta.
- Pomičući se prema gore, dobivamo naziv datoteke tracebackExp .py gdje se dogodila ova pogreška, izračun koji je uzrokovao ovu pogrešku compute = numb / div, funkcija stack2 i linija broja 6. veze gdje je izvršeno ovo računanje.
- Krećući se prema gore, vidimo da je naša funkcija stack2 pozvana u funkciji steck1 u retku broj 3.
- Krećući se prema vrhu, vidimo da je funkcijski sto1 pozvan u retku broj 11.< modul > govori nam da se datoteka izvršava.
Uobičajene iznimke Pythona
Python knjižnica definira strašno puno ugrađenih iznimaka. Možete provjeriti Python dokumentaciju ili nazvati ugrađenu lokalno () funkcionira kao dolje:
>>> dir(locals()('__builtins__'))
Nećemo pokušati riješiti sve ove iznimke, ali vidjet ćemo nekoliko uobičajenih iznimki na koje ćete vjerojatno naići.
# 1) TypeError
Povisuje se kada se operacija ili funkcija primijeni na objekt neprikladnog tipa.
Primjer 1
Razmotrite program u nastavku. Uzima dividendu i djelitelj, a zatim izračunava i ispisuje rezultat dijeljenja dividende dijeliteljem.
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()
Vrijednost dividende i djelitelja tražimo od korisnika, ali zaboravljamo uvrstiti vrijednost niza djelitelja u cijeli broj. Dakle, na kraju imamo vrstu dividende koja je cijeli broj ( int ), a vrsta djelitelja je string ( str ). Tada dobivamo TipError jer operator dijeljenja (/) ne operira nizovima.
što je .bin datoteka
Moglo bi vas zanimati da za razliku od Pythona, Javascript ima Tip prisile koja u osnovi pretvara jedan od tipova operanda u ekvivalentnu vrijednost tipa drugog operanda kada su operandi različitih vrsta.
# 2) ValueError
To se postavlja kada operacija ili funkcija primi argument koji ima pravi tip, ali neprikladnu vrijednost.
Primjer 2
Razmotrite naš program u Primjer 1 iznad.
Ako korisnik unese alfanumeričku vrijednost za dividendu poput ‘3a’, tada će naš program podići iznimku ValueError. To je zato što, iako Python int () metoda uzima bilo koji broj ili niz i vraća cjelobrojni objekt, vrijednost niza ne smije sadržavati slova ili bilo koju ne-numeričku vrijednost.
# 3) Pogreška atributa
Ova se iznimka pokreće prilikom dodjeljivanja ili referenciranja atributa koji ne postoji.
Primjer 3
Razmotrite program u nastavku. Uzima broj i izračunava svoj kvadratni korijen pomoću Python matematički 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
Kad korisnik unese broj, naš program pokušava upotrijebiti funkciju iz matematičkog modula za izračunavanje njegovog kvadratnog korijena, ali upravo ovdje, pogriješili smo. Umjesto sqrt-a, pogrešno smo upisali sqr koji ne postoji u matematičkom modulu.
Dakle, pokušavali smo uputiti atribut sqr koji ne postoji i dovelo je do podizanja iznimke AttributeError. Većina nas puno pogreši u ovoj vrsti. Dakle, niste sami.
Rukovanje iznimkama pomoću pokušaja osim
Kao programer, jedna stvar na koju će većina nas potrošiti vrijeme je pisanje robusnog koda koji je elastičan. Kôd koji se ne lomi zbog nekih pogrešaka. U Pythonu to možemo postići zatvarajući svoje izjave unutar a probati - osim izjava.
Izjava Python Try-Osim
Izjava try-osim ima sljedeću strukturu:
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here
Priložimo kod u tracebackExp .py unutar izjave 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
Pokretanje ovog koda proizvest će izlaz
Ovako funkcionira izjava try-osim. Python izvršava kôd u bloku try redak 7-8 . Ako se ne pronađe nevažeći kôd, tada se nalazi u bloku osim redak 10 se preskače i izvršenje se nastavlja.
Ali, ako se pronađe nevažeći kôd, izvršenje se odmah zaustavlja u bloku try i provjerava podudara li se izuzetak s onim koji smo naveli u naredbi osim red 9 . Ako se podudara, tada se izvršava i nastavlja blok osim. Ako se to ne dogodi, program će se prekinuti.
Blok pokušaja obično sadrži kôd koji može stvoriti iznimku, dok blok osim hvata i obrađuje iznimku.
Rukovanje višestrukim iznimkama s izuzetkom
Možemo se nositi s više iznimaka s jednim 'osim' ili s više 'izuzetaka'. Sve ovisi o tome kako želite postupati sa svakom iznimkom.
# 1) Rukovanje višestrukim iznimkama s jednim izuzetkom
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here
Ova se metoda koristi kada sumnjamo da naš kôd može stvoriti različite iznimke i u svakom slučaju želimo poduzeti iste radnje. Dakle, ako Python interpreter pronađe podudaranje, tada će se izvršiti kôd napisan u bloku osim.
Razmotrimo donji primjer Python koda
provedba popisa susjedstva c ++
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 dvije moguće iznimke koje bismo ovdje mogli navesti, ZeroDivisionError i Pogreška indeksa . Ako se pokrene bilo koja od ovih iznimki, izvršit će se blok osim.
U gornjem kodu idx = 3, dakle idx_ vrijednost postaje 0 i vrijednost / idx_ vrijednost podići će ZeroDivisionError
# 2) Rukovanje višestrukim iznimkama s višestrukim iznimkama
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Ako bismo radije htjeli obrađivati svaku iznimku zasebno, onda to možete učiniti.
Razmotrite primjer Python koda u nastavku
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
Ovdje primjećujemo da je iznimka korištena u posljednjoj izjavi osim. To je zato što se iznimka objekta iznimke podudara s bilo kojom iznimkom. Iz tog razloga, to bi uvijek trebalo biti posljednje, jer će Python prestati provjeravati druge rukovatelje iznimkama kada se jedan podudari.
U gornjem kodu, idx = 5 , stoga arr (idx) podići će Pogreška indeksa jer idx je veća od duljine popisa dolazak
Također, niste sigurni koju je iznimku pokrenula vaša aplikacija, nikada nije sigurno nastaviti s izvršavanjem. Zbog toga imamo tip Iznimka da bismo uhvatili sve nepredviđene iznimke. Zatim obavještavamo korisnika i prekidamo aplikaciju podizanjem iste iznimke.
Isprobajte Else Statement
Ovo je neobavezna značajka rukovanja iznimkama i omogućuje vam dodavanje koda koji želite pokrenuti kada se nisu dogodile pogreške. Ako se dogodi pogreška, ovaj se drugi blok neće pokrenuti.
Razmotrite primjer Python koda ispod, otvorite svoj uređivač i spremite kôd kao 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
Od korisnika dobivamo unos i koristimo ga za dijeljenje 1. Ovdje imamo dvije moguće iznimke, neispravan unos korisnika koji će uzrokovati Pogreška vrijednosti i a nula (0) što će uzrokovati ZeroDivisionError . Naša izjava osim obrađuje ove pogreške.
Sada želimo ispisati vrijednost vrijednost . Naš else-block osigurava da se ispiše samo ako se naš try blok izvrši bez greške. To je važno jer ako se u našem bloku pokušaja pojavi pogreška, vrijednost bit će nedefinirano. Dakle, pristup će mu otvoriti još jednu pogrešku.
Pokrenite gornji kod s Pythonom elseTry.py
Izlaz gore pokazuje da smo za prvi ulaz upisali 0 i pritisnuo ENTER. Budući da je naš djelitelj primio 0, podijeljen je 1 / djelitelj zeroDivisionError . Naš drugi unos bio je k koji nije valjan za int (), dakle izuzetak Pogreška vrijednosti se podiže.
Ali naš zadnji unos bio je 9 koji je valjan i kao rezultat toga dobili smo vrijednost ' vrijednost ”Otisnuto kao 0.1111111111111111
Pokušajte konačno Izjavu
Ovo je također neobavezna značajka rukovanja iznimkama i uvijek će se izvoditi bez obzira na to što se dogodi u voditeljima iznimki.
To je:
- Dogodi li se iznimka ili ne
- Čak i ako se u ostalim blokovima pozove 'povratak'.
- Čak i ako se skripta zatvori u ostalim blokovima
Dakle, ako imamo kod koji želimo pokrenuti u svim situacijama, napokon-block je naš tip. Ovaj se blok uglavnom koristi za čišćenja poput zatvaranja datoteka.
Razmotrite primjer Python koda u nastavku
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)
Ovaj kôd pokušava otvoriti i pročitati datoteku text.txt u svom trenutnom direktoriju. Ako datoteka postoji, tada će naš program ispisati prvi redak datoteke, a zatim će se pokrenuti naš konačni blok i zatvoriti datoteku.
Recimo da imamo datoteku koja se zove text.txt u direktoriju gdje se nalazi ova programska datoteka i sadrži Hello. Ako pokrenemo program, imat ćemo izlaz
Ovaj je primjer odabran namjerno jer sam želio riješiti mali problem koji se može pojaviti prilikom zatvaranja datoteka u konačno-bloku.
Ako datoteka ne postoji, iznimka FileNotFoundError bit će povišena i varijabla otvorena datoteka neće biti definirano i neće biti objekt datoteke. Stoga će pokušaj zatvaranja u konačno-blok stvoriti iznimku UnboundLocalError što je podrazred od NameError .
To u osnovi govori da pokušavamo uputiti varijablu otvorena datoteka prije nego što je dodijeljeno.
Ovdje je mali trik koristiti rukovatelje iznimkama unutar konačno-bloka.
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)
Ako naš try-block pokaže FileNotFoundError, tada ćemo imati sljedeći izlaz
Podignite iznimku
Jedna dobra vijest o iznimkama Pythona jest da ih možemo namjerno podići. Iznimke se postavljaju s podići izjavu .
Izjava o povišici ima sljedeću sintaksu:
raise (ExceptionName((*args: Object)))
Otvorite terminal i podignite bilo koji objekt iznimke iz Iznimke ugrađene u Python. Na primjer, ako podignemo ZeroDivisionError:
>>> raise ZeroDivisionError('Can't divide by zero')
Dobit ćemo povratni trag:
Pa, zašto je važno podizati iznimke?
- Kada radite s prilagođenim iznimkama.
- Tijekom provjere razuma.
Prilagođene klase izuzetaka
Prilagođena iznimka je ona koju stvorite za obradu pogrešaka specifičnih za vaše potrebe. Trik je u tome što definiramo klasu koja proizlazi iz objekta Iznimka , tada koristimo izjavu raise za povišenje naše klase iznimke.
Pretpostavimo da želimo provjeriti unos korisnika i osigurati da ulazna vrijednost nije negativna (provjera ispravnosti). Naravno, mogli bismo pokrenuti Python iznimku ValueError, ali voljet ćemo prilagoditi pogrešku dajući joj specifično i samorazumljivo ime poput InputIsNegativeError . Ali ova iznimka nije ugrađena iznimka u Python.
Dakle, prvo kreiramo našu osnovnu klasu koja će proizaći iz iznimke.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass
Tada kreiramo našu klasu iznimke koja će naslijediti osnovnu klasu i obrađivat će našu specifičnu pogrešku.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass
Isprobajmo ovo
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')
Gornji zahtjev za kod za korisnički unos i provjerite je li negativan. Ako je točno, postavlja našu prilagođenu iznimku InputIsNegativeError koja je kasnije uhvaćena u naredbi osim.
Ispod je kompletan kod:
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')
Ako je ulazna vrijednost negativan broj poput -1, tada ćemo dobiti izlaz:
Pogledajte Python dok za više detalja o prilagođenim iznimkama Pythona.
Često postavljana pitanja
P # 1) Kako Python rješava iznimku?
Odgovor: Python obrađuje iznimke koristeći izjava try-osim . Kôd koji može stvoriti iznimku postavlja se i izvršava u pokušajte blokirati dok osim bloka sadrži kôd koji će obraditi iznimke ako se pojave.
P # 2) Što pokreće iznimku u Pythonu?
Odgovor: Kad god Python interpreter naiđe na nevaljani kôd, on pokreće iznimku, što je Pythonov vlastiti način da nam kaže da se dogodilo nešto neočekivano. Također možemo namjerno stvoriti iznimke koristeći podići izjavu .
P # 3) Kako Python obrađuje višestruke iznimke?
Odgovor: Python obrađuje višestruke iznimke koristeći jedan jedini blok ili višestruki osim blokova.
Za jedan blok, iznimke se prosljeđuju kao skup: osim (Iznimka1, Iznimka2, .., IznimkaN) i Python provjerava podudaranje s desna na lijevo. U ovom slučaju poduzima se ista radnja za svaku iznimku.
Drugi način da se uhvate sve iznimke je izostavljanje imena iznimke nakon ključne riječi osim.
except: # handle all exceptions here
Drugi način je korištenje bloka osim za svaku iznimku:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
Na ovaj način možete poduzeti zasebne radnje za svaku iznimku.
P # 4) Zašto je obrada iznimki važna u Pythonu?
Odgovor: Prednost rukovanja iznimkama u Pythonu je ta što možemo stvoriti robusne, čiste i bez pogrešaka aplikacije. Nećemo željeti da nam se proizvodni kôd sruši zbog nekih pogrešaka, pa rješavamo pogreške i održavamo našu aplikaciju aktivnom.
P # 5) Kako ignorirate iznimku u Pythonu?
Odgovor: Da biste zanemarili iznimku u Pythonu, upotrijebite proći ključna riječ u bloku osim. Recimo da želimo zanemariti iznimku ValueError. Učinit ćemo to na ovaj način:
except ValueError: pass
Ako ne znate što radite, loša je praksa ignorirati iznimke. Obavijestite korisnika barem o svim potencijalnim pogreškama.
Zaključak
U ovom smo tutorijalu obradili: Python Exceptions, Traceback; kako postupati s iznimkama Probati / Osim / Drugo / Konačno blokovi, kako Podići Iznimke i konačno kako stvoriti vlastite prilagođene iznimke.
Hvala na čitanju!
kako razvrstati niz cijelih brojeva u javi
=> Posjetite ovdje da biste naučili Python ispočetka.
Preporučena literatura
- Vodič za početnike za Python (Praktični BESPLATNI trening za Python)
- Izjave o kontroli Pythona (Python Continue, Break and Pass)
- Python DateTime Vodič s primjerima
- Python string funkcije
- Python varijable
- Vodič za rukovanje iznimkama za C # s primjerima koda
- Cjelovit vodič za rukovanje iznimkama PL SQL-a s primjerima
- Java iznimke i rukovanje iznimkama s primjerima