python try except python handling exception with examples
Tento tutoriál vysvetľuje obsluhu výnimiek v Pythone pomocou bloku Try Except pomocou príkladov programovania:
Dva typy chýb môžu spôsobiť, že sa program Python náhle zastaví, t. Syntaxové chyby a Výnimky . V tomto tutoriáli sa budeme zaoberať druhým typom chyby (Výnimky) v rámci niekoľkých dôležitých tém.
Riešenie výnimiek v našej aplikácii, ako napríklad:
- Vytvára sa robustná aplikácia.
- Vytvorenie čistého a bezchybného kódu.
=> Navštívte tu sériu exkluzívnych výučbových kurzov pre Python
Čo sa dozviete:
- Python Skúste okrem
- Bežné výnimky v Pythone
- Záver
Python Skúste okrem
Jednou dobrou správou je, že Python má veľa zabudovaných výnimiek na zachytenie chýb v našom kóde. Dáva nám tiež príležitosť vytvárať vlastné výnimky, keď žiadna zo zabudovaných výnimiek nevyhovuje našim potrebám.
Čo je to výnimka
Aká je teda výnimka v Pythone? Jednoducho povedané, kedykoľvek sa tlmočník Pythonu pokúsi vykonať neplatný kód, vyvolá výnimku a v prípadoch, keď sa s takouto výnimkou nespracuje, naruší normálny tok pokynov programu a vytlačí spätné sledovanie.
Vytvorme neplatný kód a pozrime sa, ako bude reagovať tlmočník Pythonu.
Otvorte shell Pythonu a spustite nasledujúci kód.
>>> 50/0
Toto je jedna z najbežnejších chýb v programovaní. Vyššie uvedený kód sa pokúša rozdeliť číslo päťdesiat od 0 (nula). Interpret Pythonu to považuje za neplatnú operáciu a vyvolá a ZeroDivisionError , naruší program a vytlačí spätné sledovanie.
Vidíme to jasne ZeroDivisionError je výnimka, ktorá bola vznesená. Je to skutočne Pythonov spôsob, ako nám povedať, že nie je v poriadku deliť číslo na nulu. Aj keď v iných jazykoch, ako je JavaScript, nejde o chybu; a krajta prísne zakazuje tento postup.
Je tiež dôležité vedieť, že ide iba o objekt výnimky, a preto má Python zabudovaných veľa takýchto objektov. Vyskúšajte tohto funkcionára Pythonu dokumentácia zobraziť všetky vstavané výnimky Pythonu.
Pochopenie Traceback
Než sa pustíme do spracovania výnimiek, myslím si, že pomôže pochopiť, čo sa presne stane, ak sa výnimky nebudú spracovávať, a ako sa Python všemožne snaží informovať nás o našej chybe.
Kedykoľvek Python narazí na chybu, vyvolá výnimku. Ak táto výnimka nie je spracovaná, vytvorí sa nejaká informácia nazývaná Traceback. Aké informácie teda obsahuje tento spätný odkaz?
kde pozerať anime zadarmo
Obsahuje:
- Chybové hlásenie, ktoré nám hovorí, ktorá výnimka bola vyvolaná a čo sa stalo predtým, ako bola táto výnimka vyvolaná.
- Rôzne čísla riadkov kódu, ktoré spôsobili túto chybu. Chyba môže byť spôsobená postupnosťou volaní funkcií nazývaných a zásobník hovorov o ktorých si tu ešte povieme.
Aj keď je to trochu mätúce, sľubujeme, že nasledujúci príklad prinesie viac svetla do nášho porozumenia.
Pripomeňme si spätné sledovanie, ktoré bolo vytlačené z rozdelenia 50 na 0 vyššie, môžeme vidieť, že spätné sledovanie obsahuje nasledujúce informácie:
- Súbor „“: Toto nám hovorí, že tento kód bol spustený z konzolového terminálu.
- riadok 1: Toto nám hovorí, že k chybe došlo v tomto čísle riadku.
- ZeroDivisionError: delenie nula: Hovorí nám, aká výnimka bola vznesená a čo ju spôsobilo.
Skúsme ďalší príklad a možno sa dozvieme, ako a zásobník hovorov vyzerá ako. Otvorte editor, zadajte kód nižšie a uložte ako 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
Otvorte terminál v adresári, kde sa nachádza tento súbor, a spustite ho.
python tracebackExp.py
Uvidíte nasledujúce spätné sledovanie:
Vyššie uvedené spätné sledovanie sa môže zdať mätúce, ale v skutočnosti to tak nie je. Spoločnosť Pythonistas prišla s najlepším spôsobom čítania spätného sledovania, ktoré pochádza z zdola nahor . Využime teda túto múdrosť na to, aby sme pochopili, čo toto spätné sledovanie ponúka.
- Úplne dole dostaneme výnimku, ktorá bola zdvihnutá a prečo bola zdvihnutá.
- Posunom nahor dostaneme názov súboru tracebackExp .py kde došlo k tejto chybe, výpočet, ktorý túto chybu spôsobil, compute = numb / div, funkcia stack2 a linka čísla odkazu 6, kde bol tento výpočet vykonaný.
- Posunom nahor vidíme, že naša funkcia stack2 bola volaná vo funkcii stack1 v riadku číslo 3.
- Ak sa presunieme na najvyšší bod, vidíme, že funkcia stack1 bola volaná v riadku číslo 11.< modul > nám hovorí, že sa vykonáva súbor.
Bežné výnimky v Pythone
Knižnica Python definuje strašne veľa zabudovaných výnimiek. Môžete skontrolovať dokumentáciu k Pythonu alebo zavolať zabudovanú verziu miestne () Funkcia uvedená nižšie:
>>> dir(locals()('__builtins__'))
Nebudeme sa snažiť riešiť všetky tieto výnimky, ale dočkáme sa niekoľkých bežných výnimiek, na ktoré pravdepodobne narazíte.
# 1) TypeError
Vyvolá sa pri použití operácie alebo funkcie na objekt nevhodného typu.
Príklad 1
Zvážte nasledujúci program. Prijme dividendu a deliteľa, potom vypočíta a vytlačí výsledok vydelenia dividendy deliteľom.
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 používateľa požadujeme hodnotu dividendy a deliteľa, zabudneme však vložiť reťazcovú hodnotu deliteľa na celé číslo. Takže nakoniec skončíme tak, že typ dividendy bude celé číslo ( int ) a typ deliteľa je reťazec ( p ). Potom dostaneme TypeError operátor divízie (/) nefunguje na reťazcoch.
Možno vás bude zaujímať, že na rozdiel od Pythonu má Javascript Type Coercion, ktorý v zásade prevádza jeden z typov operandov na ekvivalentnú hodnotu typu druhého operandu, keď sú operandy rôznych typov.
# 2) ValueError
Toto sa vyvolá, keď operácia alebo funkcia prijme argument, ktorý má správny typ, ale neprimeranú hodnotu.
Príklad 2
Zvážte náš program v Príklad 1 vyššie.
Ak používateľ zadá pre dividendu alfanumerickú hodnotu ako „3a“, náš program zvýši výnimku ValueError. Je to preto, že hoci Python int () metóda prijme ľubovoľné číslo alebo reťazec a vráti celočíselný objekt, hodnota reťazca by nemala obsahovať písmená ani nijakú nečíselnú hodnotu.
# 3) AttributeError
Táto výnimka sa vyvoláva pri priraďovaní alebo odkazovaní na atribút, ktorý neexistuje.
Príklad 3
Zvážte program uvedený nižšie. Vezme číslo a pomocou odmocniny vypočíta svoju druhú odmocninu Matematický modul Python
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
Keď používateľ zadá číslo, náš program sa pokúsi pomocou funkcie z matematického modulu vypočítať jeho druhú odmocninu, ale práve tu sme urobili chybu. Namiesto sqrt sme omylom zadali sqr, ktorý v matematickom module neexistuje.
Skúšali sme teda odkazovať na atribút sqr, ktorý neexistuje, a viedol k vyvolaniu výnimky AttributeError. Väčšina z nás robí tento druh chyby veľa. Takže nie ste sami.
Riešenie výnimiek pomocou Try Except
Ako programátor je jedna vec, ktorú väčšina z nás strávi čas, napísaním robustného kódu, ktorý je odolný. Kód, ktorý sa nerozbije kvôli niektorým chybám. V Pythone to môžeme dosiahnuť uzavretím našich vyhlásení do a skús - okrem vyhlásenie.
Vyhlásenie Python Try-Except
Príkaz try-except má nasledujúcu štruktúru:
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here
Priložíme kód dovnútra tracebackExp .py vo vnútri príkazu try-except.
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
Spustenie tohto kódu vyprodukuje výstup
Takto funguje príkaz try-except. Python vykoná kód v bloku try riadok 7-8 . Ak sa nenájde žiadny neplatný kód, potom sa použije kód v bloku okrem riadok 10 je preskočené a poprava pokračuje.
Ak sa však nájde neplatný kód, potom sa vykonávanie okamžite zastaví v bloku try a skontroluje, či sa vyvolaná výnimka zhoduje s tou, ktorú sme zadali v príkaze okrem riadok 9 . Ak sa zhoduje, vykoná sa blok s výnimkou a pokračuje. Ak sa tak nestane, program sa preruší.
Skúšobný blok zvyčajne obsahuje kód, ktorý môže vyvolať výnimku, zatiaľ čo blokujúci blok výnimku zachytí a spracuje.
Spracovanie viacerých výnimiek s výnimkou
Môžeme spracovať viac výnimiek s jedinou „výnimkou“ alebo s viacerými „výnimkami“. Všetko závisí od toho, ako chcete zvládnuť každú výnimku.
# 1) Spracovanie viacerých výnimiek s jedinou výnimkou
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here
Táto metóda sa používa, keď máme podozrenie, že náš kód môže spôsobiť rôzne výnimky, a v obidvoch prípadoch chceme podniknúť rovnaké kroky. Takže ak tlmočník Pythonu nájde zhodu, vykoná sa kód napísaný v bloku okrem.
Zoberme si nižšie uvedený príklad kódu Pythonu
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)
Máme dve možné výnimky, ktoré by tu mohli byť vznesené, ZeroDivisionError a IndexError . Ak sa vyvolá niektorá z týchto výnimiek, vykoná sa blok s výnimkou.
V kóde vyššie idx = 3, takže idx_ hodnotu sa stáva 0 a hodnotu / idx_ hodnotu zvýši ZeroDivisionError
# 2) Riešenie viacerých výnimiek pomocou viacerých výnimiek
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Ak by sme chceli urobiť každú výnimku osobitne, potom to môžete urobiť.
Zvážte nižšie uvedený príklad kódu Pythonu
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
Všimli sme si tu, že v poslednom príkaze okrem bola použitá výnimka. Je to tak preto, lebo objekt výnimky Exception sa zhoduje s každou výnimkou. Z tohto dôvodu by mal byť vždy posledný, pretože Python prestane kontrolovať ďalšie obslužné rutiny výnimiek, akonáhle sa jeden zhoduje.
V kóde vyššie idx = 5 , teda arr (idx) zvýši Chyba indexu pretože idx je väčšie ako dĺžka zoznamu prírastok
Tiež si nie ste istí, aká výnimka bola vyvolaná vašou aplikáciou, nikdy nie je bezpečné pokračovať v spustení. Preto máme typ Výnimka, ktorý zachytáva všetky nepredvídané výnimky. Potom informujeme používateľa a prerušíme aplikáciu vyvolaním rovnakej výnimky.
Vyskúšajte príkaz Else
Toto je voliteľná funkcia spracovania výnimiek a umožňuje vám pridať kód, ktorý chcete spustiť, keď sa nevyskytnú žiadne chyby. Ak sa vyskytne chyba, tento iný blok sa nespustí.
Zvážte príklad nasledujúceho kódu Pythonu, otvorte editor a uložte kód ako else Try.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
Dostaneme vstup od používateľa a použijeme ho na rozdelenie 1. Máme tu dve možné výnimky, neplatný vstup používateľa, ktorý spôsobí ValueError a a nula (0) čo spôsobí ZeroDivisionError . Tieto chyby spracováva naše vyhlásenie s výnimkou.
Teraz chceme vytlačiť hodnotu hodnotu . Náš blok else zaisťuje, že sa vytlačí, iba ak sa blok try spustí bez chyby. Je to dôležité, pretože ak sa v našom bloku pokusov vyskytne chyba, znak hodnotu bude nedefinované. Prístup k nej teda spôsobí ďalšiu chybu.
Spustite vyššie uvedený kód s programom Python else Try.py
Vyššie uvedený výstup ukazuje, že pre prvý vstup sme zadali typ 0 a stlačte kláves ENTER. Keďže náš deliteľ dostal 0, 1 / deliteľ sa zvýšil zeroDivisionError . Náš druhý vstup bol k, ktorý je neplatný pre int (), teda výnimka ValueError je zdvihnutý.
Ako otvorím súbory .jar
Ale náš posledný vstup bol 9, ktorý je platný, a vo výsledku sme dostali hodnotu „ hodnotu ”Vytlačené ako 0.1111111111111111
Vyskúšajte príkaz konečne
Toto je tiež voliteľná funkcia spracovania výnimiek a vždy sa spustí bez ohľadu na to, čo sa stane v obslužných rutinách výnimiek.
To je:
- Bez ohľadu na to, či dôjde k výnimke
- Aj keď sa v ostatných blokoch volá „návrat“.
- Aj keď je skript v ostatných blokoch ukončený
Takže ak máme kód, ktorý chceme spustiť vo všetkých situáciách, konečne je blok náš chlap. Tento blok sa väčšinou používa na čistenie, ako je zatváranie súborov.
Zvážte nižšie uvedený príklad kódu Pythonu
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)
Tento kód sa pokúsi otvoriť a prečítať súbor text.txt v jeho aktuálnom adresári. Ak súbor existuje, náš program vytlačí prvý riadok súboru, potom sa spustí náš konečne blok a súbor sa zavrie.
Povedzme, že máme súbor s názvom text.txt v adresári, kde je tento programový súbor a obsahuje Hello. Ak spustíme program, budeme mať výstup
Tento príklad bol vybraný zámerne, pretože som chcel, aby sme riešili malý problém, ktorý sa môže vyskytnúť pri zatváraní súborov v konečne bloku.
Ak súbor neexistuje, výnimka FileNotFoundError sa zvýši a premenná otvorený súbor nebudú definované a nebudú objektom súboru. Pokus o uzavretie v bloku konečne teda vyvolá výnimku UnboundLocalError čo je podtrieda NameError .
Toto v podstate hovorí, že sa snažíme odkazovať na premennú otvorený súbor pred pridelením.
Malý trik je v tom, že sa použijú obslužné rutiny výnimiek vo vnútri konečne 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)
Ak náš blok blokovania vyvolá FileNotFoundError, budeme mať nasledujúci výstup
Zvýšiť výnimku
Jedna dobrá správa o výnimkách Pythonu je, že ich môžeme zámerne zvýšiť. Výnimky sú vyvolané zvýšiť vyhlásenie .
Príkaz raise má nasledujúcu syntax:
raise (ExceptionName((*args: Object)))
Otvorte terminál a zdvihnite akýkoľvek objekt výnimky z Výnimky zabudované v Pythone. Napríklad, ak zvýšime ZeroDivisionError:
>>> raise ZeroDivisionError('Can't divide by zero')
Dostaneme spätnú väzbu:
Prečo je teda dôležité robiť výnimky?
- Pri práci s vlastnými výnimkami.
- Počas kontrol duševného zdravia.
Triedy vlastných výnimiek
Je výnimkou, ktorú vytvoríte na spracovanie chýb, ktoré sú špecifické pre vaše potreby. Trik spočíva v tom, že definujeme triedu odvodenú od objektu Výnimka , potom pomocou príkazu raise zvýšime našu triedu výnimiek.
Predpokladajme, že chceme skontrolovať vstup používateľa a uistiť sa, že vstupná hodnota nie je záporná (kontrola zdravého rozumu). Samozrejme by sme mohli zvýšiť pythonovskú výnimku ValueError, ale radi by sme chybu prispôsobili tak, že jej dáme konkrétny a samozrejmý názov ako InputIsNegativeError . Ale táto výnimka nie je výnimkou zabudovanou do Pythonu.
Najprv teda vytvoríme našu základnú triedu, ktorá bude odvodená od výnimky.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass
Potom vytvoríme našu triedu výnimiek, ktorá zdedí základnú triedu a bude spracovávať našu konkrétnu chybu.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass
Poďme to vyskúšať
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')
Vyššie uvedená požiadavka na kód pre vstup používateľa a skontrolujte, či je záporná. Ak je to pravda, vyvolá to našu vlastnú výnimku InputIsNegativeError, ktorá sa neskôr zachytí vo vyhlásení okrem.
Nižšie je uvedený kompletný kód:
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')
Ak je vstupná hodnota záporné číslo ako -1, potom budeme mať výstup:
Pozrite sa na Python doc pre viac informácií o vlastných výnimkách Pythonu.
často kladené otázky
Otázka 1) Ako Python spracuje výnimku?
Odpoveď: Python spracováva výnimky pomocou výrok try-except . Kód, ktorý môže vyvolať výnimku, sa umiestni a vykoná v skús zablokovať kým okrem bloku uchováva kód, ktorý spracuje výnimky, ak nejaké vzniknú.
Otázka 2) Čo zvyšuje výnimku v Pythone?
Odpoveď: Kedykoľvek tlmočník Pythonu zistí neplatný kód, vyvolá výnimku, ktorá je Pythonovým spôsobom, ako nám povedať, že sa stalo niečo neočakávané. Rovnako môžeme zámerne vyvolať výnimky pomocou zvýšiť vyhlásenie .
Otázka č. 3) Ako Python spracováva viaceré výnimky?
Odpoveď: Python spracováva viac výnimiek pomocou jedného bloku okrem alebo viacerých blokov okrem.
Pre jeden blok sa výnimky odovzdávajú ako n-tica: okrem (Výnimka1, Výnimka2, .., VýnimkaN) a Python kontroluje zhodu sprava doľava. V takom prípade sa pre každú výnimku prijme rovnaká akcia.
Ďalším spôsobom, ako zachytiť všetky výnimky, je vynechať názov výnimky za kľúčovým slovom except.
except: # handle all exceptions here
Druhým spôsobom je použitie bloku okrem pre každú výnimku:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
Týmto spôsobom môžete vykonať samostatné akcie pre každú výnimku.
Otázka č. 4) Prečo je v Pythone dôležité zaobchádzanie s výnimkami?
Odpoveď: Výhodou spracovania výnimiek v Pythone je, že môžeme vytvárať robustné, čisté a bezchybné aplikácie. Nebudeme chcieť, aby sa náš produkčný kód zrútil kvôli niektorým chybám, takže chyby riešime a udržujeme našu aplikáciu v prevádzke.
Otázka č. 5) Ako ignorujete výnimku v Pythone?
Odpoveď: Ak chcete ignorovať výnimku v Pythone, použite prejsť kľúčové slovo v bloku okrem. Povedzme, že chceme ignorovať výnimku ValueError. Urobíme to takto:
except ValueError: pass
Pokiaľ neviete, čo robíte, je zlým zvykom ignorovať výnimky. Prinajmenšom informujte používateľa o všetkých potenciálnych chybách.
Záver
V tomto tutoriáli sme sa venovali: Python Exceptions, Traceback; ako zvládnuť výnimky s Vyskúšajte / Ibaže / Inak / Nakoniec bloky, ako Zdvihnite Výnimky a nakoniec, ako vytvoriť naše vlastné vlastné výnimky.
Vďaka za prečítanie!
=> Navštívte tu a naučte sa Python od nuly.
Odporúčané čítanie
- Výukový program pre Python pre začiatočníkov (praktické školenie v jazyku Python ZDARMA)
- Kontrolné príkazy Pythonu (Python Continue, Break and Pass)
- Výukový program pre Python DateTime s príkladmi
- Funkcie reťazca Python
- Premenné Pythonu
- Výukový program na spracovanie výnimiek C # s príkladmi kódu
- Kompletný sprievodca spracovaním výnimiek PL SQL s príkladmi
- Výnimky Java a spracovanie výnimiek s príkladmi