Mafunzo haya yanafafanua Ushughulikiaji wa Vighairi katika Python kwa kutumia Kizuizi cha Jaribu Isipokuwa kwa usaidizi wa mifano ya utayarishaji:
Aina mbili za hitilafu zinaweza kusababisha programu ya Chatu kuacha ghafla yaani Sintaksia Hitilafu , na Vighairi . Katika somo hili, tutakuwa tukijadili aina ya pili ya hitilafu (Vighairi) chini ya mada kadhaa muhimu.
Tutafaidika sana kutokana na kushughulikia vighairi katika programu yetu kama vile:
- Kuunda programu thabiti.
- Kuunda msimbo safi na usio na hitilafu.
Chatu Jaribu Isipokuwa
Habari moja njema ni kwamba Chatu ina idadi nzuri ya vighairi vilivyojumuishwa ili kupata hitilafu katika msimbo wetu. Pia, inatupa fursa ya kuunda vighairi maalum wakati hakuna vighairi vilivyojengewa ndani vinavyokidhi mahitaji yetu.
Je, Ni Nini Isipokuwa
Kwa hivyo kuna ubaguzi gani katika Python? Naam, kwa maneno rahisi, wakati wowote mkalimani wa Python anapojaribu kutekeleza msimbo batili, huzua ubaguzi, na katika hali ambapo ubaguzi kama huo haujashughulikiwa, huvuruga mtiririko wa kawaida wa maagizo ya programu na kuchapisha ufuatiliaji.
Hebu tuunde msimbo batili na tuone jinsi mkalimani wa Chatu atakavyojibu.
Fungua ganda la Chatu na utekeleze msimbo ufuatao.
>>> 50/0
Hii ni mojawapo ya misimbo ifuatayo. makosa ya kawaida katika programu. Msimbo ulio hapo juu unajaribu kugawanya nambari 50 na 0 (sifuri). Chatuvariable openFile kabla haijakabidhiwa.
Ujanja mdogo hapa ni kutumia vidhibiti vya kipekee ndani ya uzuiaji wa mwisho.
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)
Ikiwa jaribio letu la kujaribu litainua FileNotFoundError, basi tutakuwa na matokeo yafuatayo
Onyesha Isipokuwa
Habari moja njema kuhusu vighairi vya Python ni kwamba tunaweza kimakusudi. wainue. Vighairi vinatolewa na taarifa ya kuongeza .
Taarifa ya kuongeza ina syntax ifuatayo:
raise [ExceptionName[(*args: Object)]]
Fungua terminal na uinue kitu chochote cha ubaguzi kutoka Vighairi vya Python vilivyojengwa ndani. Kwa mfano, ikiwa tutaongeza ZeroDivisionError:
>>> raise ZeroDivisionError("Can't divide by zero")
Tutapata ufuatiliaji:
Kwa hivyo, kwa nini ni muhimu kutaja hali zisizofuata kanuni?
- Unapofanya kazi bila vizuizi maalum.
- Wakati wa ukaguzi wa afya timamu.
Madarasa ya Isiyofaa
Isipokuwa maalum ni ile unayounda kushughulikia makosa ambayo ni mahususi kwa hitaji lako. Ujanja ni kwamba, tunafafanua darasa linalotokana na kipengee Isipokuwa , kisha tunatumia taarifa ya kuongeza ili kuongeza darasa letu la kutofuata kanuni.
Tuseme tunataka kuangalia ingizo la mtumiaji na tuhakikishe thamani ya pembejeo sio hasi (angalia usawa). Bila shaka, tunaweza kuongeza ubaguzi wa Python ValueError lakini tungependa kubinafsisha hitilafu kwa kuipa jina maalum na la kujieleza kama InputIsNegativeError . Lakini ubaguzi huu sio Python iliyojengwa ndaniIsipokuwa.
Kwa hivyo kwanza, tunaunda darasa letu la msingi ambalo linatokana na Ubaguzi.
class CustomError(Exception): "Base class exception for all exceptions of this module" pass
Kisha tunaunda darasa letu la ubaguzi ambalo litarithi darasa la msingi na kushughulikia makosa yetu mahususi.
class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass
Wacha tujaribu hili
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")
Ombi la msimbo lililo hapo juu la ingizo la mtumiaji, na tuangalie ikiwa ni hasi. Ikiwa ndivyo, italeta ubaguzi wetu maalum wa InputIsNegativeError ambao baadaye unanaswa katika taarifa ya isipokuwa.
Ifuatayo ni msimbo kamili:
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")
Ikiwa thamani ya ingizo. ni nambari hasi kama -1, basi tutakuwa na matokeo:
Angalia hati ya Python kwa maelezo zaidi juu ya vighairi maalum vya Python.
13> Maswali Yanayoulizwa Mara Kwa MaraQ #1) Chatu hushughulikia vipi hali isiyofuata kanuni?
Jibu: Chatu hushughulikia vighairi kwa kutumia jaribu-isipokuwa taarifa . Msimbo ambao unaweza kuongeza ubaguzi umewekwa na kutekelezwa katika kizuizi cha kujaribu huku isipokuwa kizuizi kinashikilia msimbo ambao utashughulikia vighairi iwapo kutatokea yoyote.
Swali #2) Ni nini kinacholeta ubaguzi katika Chatu?
Jibu: Wakati wowote mkalimani wa Chatu anapokutana na msimbo batili, hutoa ubaguzi, ambao ni njia ya Chatu mwenyewe. kutuambia kwamba jambo lisilotarajiwa limetokea. Tunaweza vilevile kuibua vighairi kwa makusudi kwa kutumia kuongeza taarifa .
Q #3) Python hushughulikia vipi vizuizi vingi?
Jibu: Python hushughulikia tofauti nyingikwa kutumia block moja au nyingi isipokuwa vizuizi.
Kwa block moja, vighairi hupitishwa kama nakala: isipokuwa (Exception1, Exception2,..,ExceptionN) na ukaguzi wa Python kwa mechi kutoka kulia kwenda kushoto. Katika hali hii, hatua sawa inachukuliwa kwa kila hali isiyofuata kanuni.
Njia nyingine ya kukamata vighairi vyote ni kuacha jina la ubaguzi baada ya neno kuu isipokuwa.
except: # handle all exceptions here
Njia ya pili ni kutumia kizuizi isipokuwa kwa kila hali isiyofuata kanuni:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
Kwa njia hii, unaweza kuchukua hatua tofauti kwa kila Vighairi.
Q #4) Kwa nini utunzaji wa Vighairi ni muhimu katika Chatu?
Jibu: Manufaa ya kushughulikia vizuizi katika Python ni kwamba tunaweza kuunda programu dhabiti, safi na zisizo na makosa. Hatutataka msimbo wetu wa uzalishaji kuvurugika kwa sababu ya hitilafu fulani, kwa hivyo tunashughulikia hitilafu na kuweka programu yetu ikiendelea.
Q #5) Je, unapuuzaje ubaguzi katika Python?
Jibu: Ili kupuuza ubaguzi katika Python, tumia neno kuu la pasi katika isipokuwa kizuizi. Wacha tuseme tunataka kupuuza ubaguzi wa ValueError. Tutafanya hivi:
except ValueError: pass
Isipokuwa unajua unachofanya, ni mazoea mabaya kupuuza vizuizi. Angalau, mjulishe mtumiaji kuhusu hitilafu zote zinazoweza kutokea.
Hitimisho
Katika somo hili, tulishughulikia: Vighairi vya Python, Traceback; jinsi ya kushughulikia vighairi ukitumia Jaribu / Ila / Engine / Hatimaye kuzuia, jinsi ya Kuongeza Vighairi, na hatimaye jinsi ya kuunda Vighairi vyetu vya Maalum.
Asante kwa kusoma!
mkalimani anaona hii kama operesheni batili na anainua ZeroDivisionError, anatatiza programu, na kuchapisha ufuatiliaji.
Tunaweza kuona wazi kwamba ZeroDivisionError ni ubaguzi ambao ulitolewa. Kwa kweli ni njia ya Python mwenyewe kutuambia kuwa sio vizuri kugawa nambari na sifuri. Ingawa katika lugha zingine kama JavaScript, hii sio kosa; na chatu anakataza kabisa tabia hii.
Pia, ni muhimu kujua kwamba hiki ni kitu cha kipekee na Chatu ina vitu vingi kama hivyo vilivyojengwa ndani. Angalia hati hii rasmi ya Python ili kuona Vighairi vyote vya Chatu Vilivyojengwa Ndani.
Kuelewa Ufuatiliaji
Kabla hatujaanza kushughulikia vighairi, nadhani itasaidia kuelewa ni nini kitakachofanyika ikiwa vighairi hazishughulikiwi na jinsi Python inavyofanya vyema zaidi kutufahamisha kuhusu kosa letu.
Kila Chatu inapokutana na hitilafu, huzua hali ya kutofuata kanuni. Ikiwa ubaguzi huu hautashughulikiwa, basi hutoa habari inayoitwa Traceback. Kwa hivyo, ufuatiliaji huu una taarifa gani?
Ina:
- Ujumbe wa hitilafu ambao unatuambia ni ubaguzi gani ulitolewa na nini kilifanyika kabla ya ubaguzi huu kuwa imetolewa.
- Nambari mbalimbali za laini za msimbo zilizosababisha hitilafu hii. Hitilafu inaweza kusababishwa na msururu wa simu za chaguo za kukokotoa zinazoitwa runda la simu ambalo tutalijadili baadaye hapa.
Ingawa ni simuinachanganya kidogo, tunaahidi kwamba mfano unaofuata utaleta mwanga zaidi kwa uelewa wetu.
Kumbuka ufuatiliaji ambao ulichapishwa kutokana na kugawanya 50 na 0 hapo juu, tunaweza kuona kwamba ufuatiliaji una taarifa ifuatayo:
- Faili “”: Hii inatuambia kwamba msimbo huu uliendeshwa kutoka kwa terminal ya kiweko.
- mstari wa 1: Hii inatuambia kwamba hitilafu ilitokea katika nambari hii ya laini.
- ZeroDivisionError: division by zero: Inatuambia ni ubaguzi gani ulitolewa na nini ulisababisha.
Hebu tujaribu mfano mwingine na labda uone jinsi runda la simu linavyoonekana. Fungua kihariri, weka msimbo ulio hapa chini na uhifadhi kama 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
Fungua terminal katika saraka ambapo faili hii inapatikana na kuendeshwa.
python tracebackExp.py
Utaona ufuatiliaji ufuatao:
Ufuatiliaji wa hapo juu unaweza kuonekana kuwa wa kutatanisha lakini sivyo. Pythonistas walikuja na njia bora ya kusoma traceback, ambayo ni kutoka chini kwenda juu . Kwa hivyo, hebu tutumie hekima hii kujaribu na kuelewa ni nini ufuatiliaji huu unaweza kutoa.
- Kwa kiwango cha chini kabisa, tunapata ubaguzi ambao ulitolewa na kwa nini ulikuzwa.
- Kusonga juu, tunapata jina la faili tracebackExp .py ambapo hitilafu hii ilitokea, hesabu iliyosababisha kosa hili compute = numb/div, kazi stack2, na kiungo cha nambari 6 ambapo hesabu hii ilifanywa. .
- Tukisonga juu, tunaona kwamba stack2 yetu hufanya kaziiliitwa katika safu ya chaguo za kukokotoa1 katika mstari nambari 3.
- Tukihamia sehemu ya juu kabisa, tunaona kwamba safu ya chaguo za kukokotoa1 iliitwa katika mstari nambari 11. moduli > inatuambia kuwa ni faili ambayo inatekelezwa.
Vighairi vya Kawaida vya Chatu
Maktaba ya Python inafafanua vighairi vingi vibaya vilivyojumuishwa. Unaweza kuangalia Hati ya Python au kupiga simu iliyojengwa ndani local () kazi kama ilivyo hapo chini:
>>> dir(locals()['__builtins__'])
Hatutajaribu kushughulikia isipokuwa hizi zote, lakini tutaona tofauti chache za kawaida. ambayo huenda utakutana nayo.
#1) TypeError
Inatolewa wakati operesheni au chaguo la kukokotoa linatumika kwa kitu cha aina isiyofaa.
Mfano 1
Zingatia programu iliyo hapa chini. Inachukua gawio na kigawanyaji, kisha kukokotoa na kuchapisha matokeo ya kugawanya gawio na kigawanya.
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()
Tunaomba thamani ya gawio na kigawanyaji kutoka kwa mtumiaji, lakini tunasahau kutupa kamba ya kigawanyaji. thamani ndani ya nambari kamili. Kwa hivyo, tunaishia na aina ya gawio kuwa integer( int ) na aina ya kigawanyiko kuwa kamba( str ). Kisha tunapata TypeError kwa vile kiendesha kitengo (/) hakifanyi kazi kwenye mifuatano.
Inaweza kukuvutia kujua kuwa tofauti na Chatu, Javascript ina Aina ya Coercion ambayo kimsingi inabadilisha moja ya aina za operesheni kuwa thamani sawa ya aina ya operesheni nyingine wakati operesheni ni za.aina tofauti.
#2) Hitilafu ya Thamani
Hii hukuzwa wakati operesheni au chaguo la kukokotoa linapopokea hoja ambayo ina aina sahihi lakini thamani isiyofaa.
Mfano 2
Zingatia programu yetu katika Mfano 1 hapo juu.
Mtumiaji akiweka thamani ya alphanumeric kwa gawio kama '3a', basi programu yetu itaongeza ubaguzi wa ValueError. Hii ni kwa sababu, ingawa mbinu ya Python int() inachukua nambari yoyote au mfuatano wowote na kurudisha kitu kamili, thamani ya mfuatano haipaswi kuwa na herufi au thamani yoyote isiyo ya nambari.
#3) AttributeError
Ubaguzi huu umetolewa wakati wa kukabidhi au kurejelea sifa ambayo haipo.
Mfano 3
Fikiria mpango chini. Inachukua nambari na kukokotoa mzizi wake wa mraba kwa kutumia moduli ya hesabu ya 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
Mtumiaji anapoingiza nambari, programu yetu inajaribu kutumia chaguo la kukokotoa kutoka kwa moduli ya hesabu kukokotoa mzizi wake wa mraba lakini hiyo hapa, tulifanya makosa. Badala ya sqrt, tuliandika kimakosa sqr ambayo haipo kwenye sehemu ya hesabu.
Kwa hivyo, tulikuwa tunajaribu kurejelea sifa sqr ambayo haipo na inayoongoza. isipokuwa AttributeError kukuzwa. Wengi wetu hufanya makosa ya aina hii sana. Kwa hivyo, hauko peke yako.
Kushughulikia Vighairi Kwa Kujaribu Isipokuwa
Kama mtayarishaji programu, jambo moja ambalo wengi wetu tutatumia wakati wetu ni kuandika msimbo thabiti ambao niustahimilivu. Msimbo ambao hauvunjiki kwa sababu ya makosa kadhaa. Katika Python, tunaweza kufanikisha hili kwa kuambatanisha taarifa zetu ndani ya jaribu – isipokuwa taarifa.
Taarifa ya Jaribu-Isiyo ya Python
Taarifa ya kujaribu-isipokuwa ina muundo ufuatao:
try: #your code goes here except """Specify exception type(s) here""": #handle exception here
Hebu tuambatishe msimbo katika tracebackExp .py ndani ya taarifa ya kujaribu-isipokuwa.
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
Kutekeleza msimbo huu kutazalisha matokeo
Hivi ndivyo taarifa ya kujaribu isipokuwa inavyofanya kazi. Python hutekeleza msimbo kwenye jaribio la kuzuia mstari wa 7-8 . Iwapo hakuna msimbo batili unaopatikana, basi msimbo katika isipokuwa kizuizi mstari wa 10 unarukwa na utekelezaji unaendelea.
Lakini, msimbo batili ukipatikana, basi utekelezaji utakoma mara moja kwenye jaribu kuzuia na uangalie ikiwa ubaguzi uliotolewa unalingana na ule tuliotoa katika taarifa isipokuwa mstari wa 9 . Ikiwa inalingana, basi block isipokuwa inatekelezwa na inaendelea. Ikiwa haifanyi hivyo, basi programu itakatiza.
Kizuizi cha kujaribu kwa kawaida huwa na msimbo ambao unaweza kuzua ubaguzi huku kizuizi pekee kinashika na kushughulikia ubaguzi.
Kushughulikia Nyingi Vighairi Kwa Isipokuwa
Tunaweza kushughulikia vighairi vingi kwa "isipokuwa" moja au "vighairi" vingi. Yote inategemea jinsi unavyotaka kushughulikia kila hali isiofuata kanuni.
#1) Kushughulikia Vighairi Nyingi Kwa Mmoja Mmoja Isipokuwa
try: #your code goes here except(Exception1[, Exception2[,...ExceptionN]]]): #handle exception here
Njia hii inatumiwa tunaposhuku kuwa msimbo wetu unawezaongeza vighairi tofauti na tunataka kuchukua hatua sawa katika kila kesi. Kwa hivyo, ikiwa mkalimani wa Python atapata inayolingana, basi msimbo ulioandikwa katika isipokuwa block utatekelezwa.
Hebu tuchunguze mfano wa msimbo wa Python hapa chini
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)
Tuna mbili vighairi vinavyowezekana ambavyo vinaweza kuonyeshwa hapa, ZeroDivisionError na IndexError . Ikiwa mojawapo ya vighairi hivi vitaongezwa, basi kizuizi kitatekelezwa.
Katika msimbo ulio hapo juu, idx=3, kwa hivyo idx_ thamani inakuwa 0 na thamani /idx_ thamani itaongeza ZeroDivisionError
#2) Kushughulikia Vighairi Nyingi Pamoja na Vighairi Vingi
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Ikiwa tunataka kushughulikia kila isipokuwa kivyake, basi hivi ndivyo unavyoweza kuifanya.
Fikiria mfano wa msimbo wa Chatu hapa chini
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
Tunaona hapa kuwa Isipokuwa ilitumika katika mwisho isipokuwa taarifa. . Hii ni kwa sababu Ubaguzi wa kitu unalingana na ubaguzi wowote. Kwa sababu hii, inapaswa kuwa ya mwisho kila wakati, kwa kuwa Python itaacha kuangalia vidhibiti vingine mara moja inalingana.
Katika msimbo ulio hapo juu, idx=5 , kwa hivyo arr[idx ] itaongeza IndexError kwa sababu idx ni kubwa kuliko urefu wa orodha arr
Pia, huna uhakika ni ubaguzi gani uliotolewa na ombi lako si salama kuendelea na utekelezaji. Ndio maana tunayo aina ya Isipokuwa ili kupata ubaguzi wowote ambao haujatabiriwa. Kisha, tunawajulishamtumiaji na ukatishe programu kwa kutaja hali ya kutofuata kanuni sawa.
Jaribu Taarifa Nyingine
Hiki ni kipengele cha hiari cha utunzaji wa kipekee na hukuruhusu kuongeza msimbo unaotaka kukimbia wakati hakuna makosa yaliyotokea. Hitilafu ikitokea, kizuizi hiki kingine hakitatumika.
Fikiria mfano wa Python code bellow, fungua kihariri chako na uhifadhi msimbo kama mwingineTry.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
Tunapata maoni kutoka kwa mtumiaji na kuyatumia kugawanya 1. Tuna vighairi viwili vinavyowezekana hapa, ingizo batili la mtumiaji ambalo litasababisha ValueError na zero(0) ambayo itasababisha ZeroDivisionError . Taarifa yetu isipokuwa inashughulikia hitilafu hizi.
Sasa, tunataka kuchapisha thamani ya thamani . Kizuizi chetu kingine kinahakikisha kuwa kimechapishwa ikiwa tu jaribio letu la kuzuia litatekelezwa bila hitilafu. Hii ni muhimu kwa sababu ikiwa hitilafu itatokea katika jaribio letu la kujaribu, thamani haitabainishwa. Kwa hivyo, kuifikia kutaibua hitilafu nyingine.
Tekeleza msimbo hapo juu ukitumia Python elseTry.py
Toleo lililo hapo juu linaonyesha kuwa kwa ingizo la kwanza, tuliandika 0 na kubonyeza ENTER. Kwa kuwa kigawanyaji chetu kilipokea 0, 1/kigawanyiko kiliinua zeroDivisionError . Ingizo letu la pili lilikuwa k ambalo si sahihi kwa int (), kwa hivyo ubaguzi ValueError umeinuliwa.
Lakini ingizo letu la mwisho lilikuwa 9 ambalo ni halali na kama a matokeo, tulipata thamani ya “ thamani ” iliyochapishwa kama 0.1111111111111111
Jaribu HatimayeTaarifa
Hiki pia ni kipengele cha hiari cha ushughulikiaji usiofuata sheria na kitaendeshwa kila mara bila kujali kitakachotokea katika vidhibiti vighairi.
Hiyo ni:
- Iwapo ubaguzi utatokea au la
- Hata kama 'kurudi' kutaitwa katika vizuizi vingine.
- Hata kama hati imeondolewa kwenye vizuizi vingine
Kwa hivyo, ikiwa tuna nambari ya kuthibitisha ambayo tunataka kutekeleza katika hali zote, hatimaye-block ndiye mtu wetu. Kizuizi hiki hutumika zaidi kwa usafishaji kama vile kufunga faili.
Fikiria mfano wa msimbo wa Python hapa chini
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)
Msimbo huu hujaribu kufungua na kusoma faili text.txt katika saraka yake ya sasa. Ikiwa faili iko, basi programu yetu itachapisha safu ya kwanza ya faili kisha kizuizi chetu cha mwisho kitaendesha na kufunga faili.
Sema tuna faili inayoitwa text.txt kwenye saraka ambapo faili hii ya programu iko na ina Hello. Ikiwa tutaendesha programu, tutakuwa na matokeo
Mfano huu ulichaguliwa kimakusudi kwa sababu nilitaka tushughulikie tatizo dogo ambalo linaweza kutokea wakati wa kufunga faili katika hatimae- block.
Ikiwa faili haipo, ubaguzi FileNotFoundError utaongezwa na kigezo cha openFile hakitabainishwa na hakitakuwa faili. kitu. Kwa hivyo, kujaribu kuifunga kwenye kizuizi cha mwisho kutaongeza ubaguzi UnboundLocalError ambayo ni aina ndogo ya NameError .
Hii kimsingi inasema kwamba tunajaribu kurejelea ya