Ushbu qo'llanmada Python-da Try Except bloki yordamida istisnolardan foydalanishni dasturlash misollari yordamida tushuntiriladi:
Ikki xato turi Python dasturining keskin to'xtab qolishiga olib kelishi mumkin, ya'ni Sintaksis. Xatolar va Istisnolar . Ushbu qo'llanmada biz bir nechta muhim mavzular ostida ikkinchi xato turini (Istisnolar) muhokama qilamiz.
Ilovamizdagi istisnolarni ko'rib chiqishdan ko'p foyda olamiz, masalan:
- Mustahkam dastur yaratish.
- Toza va xatosiz kod yaratish.
Python Try Except
Yaxshi xabar shundaki, Python kodimizdagi xatolarni aniqlash uchun juda ko'p o'rnatilgan istisnolarga ega. Bundan tashqari, u bizga o'rnatilgan istisnolardan hech biri bizning ehtiyojlarimizga mos kelmasa, maxsus istisnolarni yaratish imkoniyatini beradi.
Istisno nima
Xo'sh, Pythonda istisno nima? Oddiy qilib aytganda, Python tarjimoni yaroqsiz kodni bajarishga harakat qilganda, u istisnoni keltirib chiqaradi va bunday istisno ko'rib chiqilmagan hollarda, u dastur ko'rsatmalarining normal oqimini buzadi va kuzatuvni chop etadi.
Keling, yaroqsiz kod yaratamiz va Python tarjimoni qanday javob berishini ko'ramiz.
Python qobig'ini oching va quyidagi kodni ishga tushiring.
>>> 50/0
Bu quyidagilardan biri dasturlashda eng ko'p uchraydigan xatolar. Yuqoridagi kod 50 sonini 0 (nol) ga boʻlishga harakat qiladi. Pythono'zgaruvchisi openFile tayinlanishidan oldin.
Bu erda kichik bir hiyla - finally-blok ichida istisno ishlov beruvchilaridan foydalanish.
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)
Agar bizning sinash blokimiz FileNotFoundError-ni ko'tarsa, biz quyidagi natijaga ega bo'lamiz
Istisnoni ko'tarish
Python istisnolari haqida yaxshi xabar shundaki, biz ataylab ularni ko'taring. Istisnolar raise bayonoti bilan ko'tariladi.
Raise bayonoti quyidagi sintaksisga ega:
raise [ExceptionName[(*args: Object)]]
Terminalni oching va har qanday istisno obyektini ko'taring. Python o'rnatilgan istisnolar. Masalan, agar ZeroDivisionError-ni ko'tarsak:
>>> raise ZeroDivisionError("Can't divide by zero")
Biz kuzatuvni olamiz:
Demak, Nima uchun istisnolarni ko'tarish muhim?
- Maxsus istisnolar bilan ishlashda.
- Aql-idrokni tekshirish vaqtida.
Maxsus istisno sinflari
Xususiy istisno - bu sizning ehtiyojlaringizga mos keladigan xatolarni hal qilish uchun yaratadigan istisno. Ayyorlik shundaki, biz Exception obyektidan kelib chiqadigan sinfni aniqlaymiz, so‘ngra istisno klassimizni ko‘tarish uchun rise iborasidan foydalanamiz.
Faraz qilaylik, biz foydalanuvchi kiritishini tekshirmoqchimiz va ishonch hosil qilmoqchimiz. kirish qiymati salbiy emas (aqlini tekshirish). Albatta, biz Python ValueError istisnosini ko'tarishimiz mumkin, lekin biz xatoni InputIsNegativeError kabi o'ziga xos va o'z-o'zidan tushunarli nom berish orqali sozlashni xohlaymiz. Ammo bu istisno Python o'rnatilgan emasIstisno.
Shunday qilib, birinchi navbatda biz Exceptiondan kelib chiqadigan asosiy sinfimizni yaratamiz.
class CustomError(Exception): "Base class exception for all exceptions of this module" pass
Keyin biz asosiy sinfni meros qilib oladigan va maxsus xatomizni hal qiladigan istisno sinfimizni yaratamiz.
class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass
Keling, buni sinab ko'raylik
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")
Foydalanuvchi kiritish uchun yuqoridagi kod so'rovi va uning salbiy ekanligini tekshiring. Agar rost bo'lsa, u bizning maxsus istisnomiz InputIsNegativeErrorni ko'taradi, bu keyinchalik istisno bayonotida saqlanadi.
Quyida to'liq 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")
Agar kirish qiymati bo'lsa -1 kabi manfiy raqam bo'lsa, unda biz quyidagi natijaga ega bo'lamiz:
Python maxsus istisnolari haqida batafsil ma'lumot olish uchun Python hujjatini tekshiring.
Tez-tez so'raladigan savollar
Savol №1) Python istisnolarni qanday hal qiladi?
Javob: Python istisnolarni yordamida boshqaradi. try-except ifodasi . Istisnoni ko'tarishi mumkin bo'lgan kod blokdan tashqari ga joylashtiriladi va bajariladi, blokdan tashqari esa, agar mavjud bo'lsa, istisnolarni hal qiladigan kodni saqlaydi.
2-savol) Python-da istisno nima sabab bo'ladi?
Javob: Python tarjimoni yaroqsiz kodga duch kelganda, u Pythonning o'ziga xos usuli bo'lgan istisnoni keltirib chiqaradi. kutilmagan bir narsa sodir bo'lganligini aytish uchun. Biz raise iborasi yordamida istisnolarni ataylab ko'tarishimiz mumkin.
3-savol) Python bir nechta istisnolarni qanday hal qiladi?
Javob: Python bir nechta istisnolarni boshqaradibitta blokdan tashqari yoki bir nechta blokdan tashqari foydalanish.
Bir blok uchun istisnolar kortej sifatida uzatiladi: istisno (Exception1, Exception2,..,ExceptionN) va Python tekshiruvlari o'ngdan chapga o'yin uchun. Bunday holda, har bir istisno uchun bir xil harakat amalga oshiriladi.
Barcha istisnolarni qo'lga olishning yana bir usuli - except kalit so'zidan keyin istisno nomini qoldirishdir.
except: # handle all exceptions here
Ikkinchi usul - har bir istisno uchun istisno blokidan foydalanish uchun:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here
Shunday qilib, har bir Istisno uchun alohida amallarni bajarishingiz mumkin.
4-savol) Nima uchun Pythonda istisnolardan foydalanish muhim?
Javob: Python-da istisnolar bilan ishlashning afzalligi shundaki, biz mustahkam, toza va xatosiz ilovalar yaratishimiz mumkin. Ba'zi xatolar tufayli ishlab chiqarish kodimiz ishdan chiqishini istamaymiz, shuning uchun biz xatolarni hal qilamiz va ilovamizni ishlayotgan holatda ushlab turamiz.
Savol №5) Python'dagi istisnoni qanday e'tiborsiz qoldirasiz?
Javob: Python-da istisnoga e'tibor bermaslik uchun istisno blokidagi pass kalit so'zidan foydalaning. Aytaylik, biz ValueError istisnosini e'tiborsiz qoldirmoqchimiz. Biz buni shunday qilamiz:
except ValueError: pass
Agar nima qilayotganingizni bilmasangiz, istisnolarga e'tibor bermaslik yomon amaliyotdir. Hech bo'lmaganda foydalanuvchini barcha mumkin bo'lgan xatolar haqida xabardor qiling.
Xulosa
Ushbu qo'llanmada biz quyidagilarni ko'rib chiqdik: Python istisnolari, Traceback; Urinish / Istisno / Boshqa / Nihoyat bilan istisnolarni qanday hal qilish kerakbloklar, qanday qilib ko'tarish Istisnolar va nihoyat, o'zimizning maxsus istisnolarimizni qanday yaratishimiz mumkin.
O'qiganingiz uchun rahmat!
tarjimon buni noto'g'ri operatsiya deb biladi va ZeroDivisionErrorni ko'taradi, dasturni buzadi va kuzatuvni chop etadi.
Biz buni aniq ko'rishimiz mumkin ZeroDivisionError - bu ko'tarilgan istisno. Bu Pythonning o'ziga xos usuli bo'lib, raqamni nolga bo'lish unchalik yaxshi emas. Garchi JavaScript kabi boshqa tillarda bu xato emas; va python bu amaliyotni qat'iyan man qiladi.
Shuningdek, shuni bilish kerakki, bu faqat istisno ob'ekti va Pythonda bunday ob'ektlar ko'p o'rnatilgan. Barcha Python oʻrnatilgan istisnolarini koʻrish uchun ushbu Python rasmiy hujjatlarini koʻrib chiqing.
Tracebackni tushunish
Istisnolarni koʻrib chiqishdan oldin, agar istisnolar boʻlsa, aynan nima sodir boʻlishini tushunishga yordam beradi deb oʻylayman. ishlov berilmaydi va Python bizning xatomiz haqida bizga ma'lumot berish uchun qo'lidan kelganicha harakat qiladi.
Python har doim xatoga duch kelganda, u istisno qiladi. Agar bu istisno ishlanmasa, u Traceback deb nomlangan ba'zi ma'lumotlarni ishlab chiqaradi. Xo'sh, bu kuzatuv qanday ma'lumotlarni o'z ichiga oladi?
U quyidagilarni o'z ichiga oladi:
- Bizga qanday istisno ko'tarilganligi va bu istisnodan oldin nima sodir bo'lganligini bildiruvchi xato xabari ko'tarildi.
- Ushbu xatoga sabab bo'lgan kodning turli qator raqamlari. Xatoga chaqiruv stegi deb nomlangan funksiya chaqiruvlari ketma-ketligi sabab boʻlishi mumkin buni keyinroq bu yerda muhokama qilamiz.
Garchi bubiroz chalkash, keyingi misol tushunchamizga ko'proq oydinlik kiritishiga va'da beramiz.
Yuqoridagi 50 ni 0 ga bo'lish orqali chop etilgan kuzatuvni eslang, biz kuzatuv quyidagi ma'lumotlarni o'z ichiga olganini ko'rishimiz mumkin:
- Fayl “”: Bu bizga ushbu kod konsol terminalidan ishga tushirilganligini bildiradi.
- 1-qator: Bu bizga xatolik ushbu qator raqamida yuz berganligini bildiradi.
- ZeroDivisionError: nolga bo'linish: U bizga qanday istisno va nima sabab bo'lganini aytadi.
Keling, boshqa misolni ko'rib chiqamiz va qo'ng'iroqlar to'plami qanday ko'rinishini ko'rishingiz mumkin. Tahrirlovchini oching, quyidagi kodni kiriting va 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
Shu fayl joylashgan katalogda terminalni oching va ishga tushiring.
python tracebackExp.py
Siz quyidagi kuzatuvni ko'rasiz:
Yuqoridagi kuzatuv chalkash tuyulishi mumkin, lekin aslida unday emas. Pythonistas kuzatuvni o'qishning eng yaxshi usulini topdi, bu pastdan yuqoriga . Shunday ekan, keling, bu hikmatdan foydalanib, bu kuzatuv nimani taklif qilishini tushunishga harakat qilaylik.
- Eng pastda, biz ko'tarilgan va nima uchun ko'tarilgan istisnoni olamiz.
- Yuqoriga o‘tsak, biz ushbu xatolik yuz bergan tracebackExp .py fayl nomini, bu xatoga sabab bo‘lgan hisoblashni hisoblash = numb/div, funktsiya stack2 va ushbu hisoblash amalga oshirilgan havola raqami qatorini olamiz. .
- Yuqoriga o'tsak, biz stack2 ishlayotganini ko'ramiz3-qatordagi stack1 funktsiyasida chaqirilgan.
- Eng yuqoriga o'tsak, stack1 funktsiyasi 11-satrda chaqirilganligini ko'ramiz. modul > bu bajarilayotgan fayl ekanligini aytadi.
Umumiy Python istisnolari
Python kutubxonasi juda koʻp oʻrnatilgan istisnolarni belgilaydi. Siz Python Hujjatlarini tekshirishingiz yoki o'rnatilgan local () funksiyasini quyidagi tarzda chaqirishingiz mumkin:
>>> dir(locals()['__builtins__'])
Biz bu istisnolarni ko'rib chiqishga urinmaymiz, biroq bir nechta umumiy istisnolarni ko'rib chiqamiz. Siz duch kelishingiz mumkin.
#1) TypeError
U amal yoki funksiya nomaqbul turdagi ob'ektga qo'llanilganda ko'tariladi.
1-misol
Quyidagi dasturni ko'rib chiqing. U dividend va bo'luvchini oladi, so'ngra dividendni bo'luvchiga bo'lish natijasini hisoblab chiqadi va chop etadi.
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()
Biz foydalanuvchidan dividend va bo'luvchining qiymatini so'raymiz, lekin biz bo'luvchi qatorini chiqarishni unutamiz. qiymatni butun songa aylantiring. Shunday qilib, biz dividend turini integer ( int ) va bo'luvchining turini satr ( str ) bilan yakunlaymiz. Keyin biz TypeError ni olamiz, chunki bo'linish operatori (/) satrlarda ishlamaydi.
Python-dan farqli o'laroq, buni bilish sizni qiziqtirishi mumkin. Javascriptda "Type Coercion" mavjud bo'lib, u operandlarning bir turini operandlar bo'lganda boshqa operand turining ekvivalent qiymatiga aylantiradi.har xil turlar.
#2) ValueError
Bu operatsiya yoki funksiya toʻgʻri turga ega, lekin nomaqbul qiymatga ega boʻlgan argumentni qabul qilganda paydo boʻladi.
Misol 2
Yuqoridagi misol 1 dagi dasturimizni ko'rib chiqing.
Agar foydalanuvchi dividend uchun "3a" kabi alfanumerik qiymat kiritsa, bizning dasturimiz ko'tariladi. ValueError istisnosi. Buning sababi, Python int() usuli har qanday raqam yoki satrni qabul qilib, butun son ob'ektini qaytarsa ham, satr qiymati harflar yoki raqamli bo'lmagan qiymatdan iborat bo'lmasligi kerak.
#3) AttributeError
Ushbu istisno mavjud boʻlmagan atributni tayinlash yoki unga havola qilishda yuzaga keladi.
3-misol
Dasturni koʻrib chiqing. quyida. U raqamni oladi va uning kvadrat ildizini Python matematik moduli yordamida hisoblaydi
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
Foydalanuvchi raqam kiritganda, bizning dasturimiz uning kvadrat ildizini hisoblash uchun matematik modul funksiyasidan foydalanishga harakat qiladi, ammo bu erda, xato qildik. sqrt o'rniga biz matematik modulda mavjud bo'lmagan sqr ni xato qilib yozdik.
Shunday qilib, biz mavjud bo'lmagan sqr atributiga murojaat qilmoqchi bo'ldik va uni boshqaradi. istisno AttributeError ko'tarilmoqda. Ko'pchiligimiz bunday xatoga yo'l qo'yamiz. Demak, siz yolg'iz emassiz.
Istisnolarni sinashdan tashqari boshqarish
Dasturchi sifatida ko'pchiligimiz vaqtimizni sarflaydigan narsadan biri bu ishonchli kod yozishdir.chidamli. Ba'zi xatolar tufayli buzilmaydigan kod. Pythonda biz bunga o'z bayonotlarimizni try – except ifodasi ichiga qo'shish orqali erishishimiz mumkin.
Python Try-Except bayonoti
Try-except iborasi quyidagi tuzilishga ega:
try: #your code goes here except """Specify exception type(s) here""": #handle exception here
Keling, tracebackExp .py-ga kodni try-except ifodasi ichiga kiritamiz.
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
Ushbu kodni ishga tushirish natijani beradi
Try-except bayonoti shunday ishlaydi. Python kodni sinash blokidagi satr 7-8 da bajaradi. Agar noto'g'ri kod topilmasa, 10-qator dan tashqari blokdagi kod o'tkazib yuboriladi va bajarish davom etadi.
Ammo, agar noto'g'ri kod topilsa, u holda bajarish darhol to'xtatiladi. blokni sinab ko'ring va ko'tarilgan istisno biz istisno bayonotida 9-qator ko'rsatganimiz bilan mos kelishini tekshiradi. Agar u mos kelsa, istisno bloki bajariladi va davom etadi. Agar shunday bo'lmasa, u holda dastur to'xtatiladi.
Sinab ko'rish bloki odatda istisnoni ko'tarishi mumkin bo'lgan kodni o'z ichiga oladi, istisno-blok esa istisnoni ushlaydi va boshqaradi.
Bir nechta bilan ishlash. Istisnolar
dan tashqari bir nechta istisnolarni bitta "istisno" yoki bir nechta "istisnolar" bilan hal qilishimiz mumkin. Hammasi har bir istisnoni qanday hal qilmoqchi ekanligingizga bog'liq.
#1) Bir nechta istisnolarni bitta bilan ishlash
try: #your code goes here except(Exception1[, Exception2[,...ExceptionN]]]): #handle exception here
Bu usul bizning kodimiz shunday bo'lishi mumkinligiga shubha qilganimizda qo'llaniladi.turli istisnolarni ko'taring va biz har bir holatda bir xil harakat qilishni xohlaymiz. Demak, agar Python tarjimoni moslikni topsa, istisno blokida yozilgan kod bajariladi.
Quyidagi misol Python kodini ko'rib chiqamiz
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)
Bizda ikkitasi bor. bu erda ko'tarilishi mumkin bo'lgan istisnolar, ZeroDivisionError va IndexError . Agar ushbu istisnolardan birortasi ko'tarilsa, istisno bloki bajariladi.
Yuqoridagi kodda idx=3, shuning uchun idx_ qiymat 0 va qiymat ga aylanadi. /idx_ qiymat ZeroDivisionError-ni oshiradi
#2) Bir nechta istisnolar bilan bir nechta istisnolarni qayta ishlash
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here
Agar biz ishlov berishni xohlasak Har bir istisno alohida bo'lsa, buni shunday qilishingiz mumkin.
Quyidagi misol Python kodini ko'rib chiqing
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
Biz bu erda Exception oxirgi istisno bayonotida ishlatilganligini ko'ramiz. . Buning sababi, istisno ob'ekti Exception har qanday istisnoga mos keladi. Shu sababli, u har doim oxirgi bo'lishi kerak, chunki Python boshqa istisnolar ishlov beruvchilari mos kelgandan keyin tekshirishni to'xtatadi.
Yuqoridagi kodda idx=5 , shuning uchun arr[idx ] ko'taradi IndexError , chunki idx ro'yxat uzunligidan kattaroqdir arr
Shuningdek, arizangiz tomonidan qanday istisno ko'tarilganiga ishonchingiz komil emas, ijroni davom ettirish hech qachon xavfsiz emas. Shuning uchun bizda oldindan aytib bo'lmaydigan istisnolarni ushlash uchun istisno turi mavjud. Keyin xabar beramizfoydalanuvchi va bir xil istisnoni ko'tarish orqali ilovani to'xtatib qo'ying.
Boshqacha qilib ko'ring bayonoti
Bu istisnolarni qayta ishlashning ixtiyoriy xususiyati va siz xohlagan kodni qo'shish imkonini beradi. hech qanday xato bo'lmaganda ishga tushiring. Agar xatolik yuzaga kelsa, bu else-blok ishlamaydi.
Quyidagi misol Python kodini ko'rib chiqing, muharriringizni oching va kodni 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) break0 sifatida saqlang>Biz foydalanuvchidan ma'lumot olamiz va undan 1 ga bo'lish uchun foydalanamiz. Bu erda ikkita mumkin bo'lgan istisnolar mavjud, yaroqsiz foydalanuvchi kiritishi ValueErrorva nol(0)sabab bo'ladi. ZeroDivisionError. Bizning istisno bayonotimiz bu xatolarni hal qiladi.
Endi biz qiymat qiymatini chop qilmoqchimiz. Bizning else-blokimiz faqat try blokimiz xatosiz bajarilgan taqdirdagina chop etilishiga ishonch hosil qiladi. Bu juda muhim, chunki urinish blokimizda xatolik yuzaga kelsa, qiymat aniqlanmagan bo'ladi. Demak, unga kirish boshqa xatolikka olib keladi.
Yuqoridagi kodni Python elseTry.py bilan ishga tushiring
Yuqoridagi natija shuni ko'rsatadiki birinchi kiritish uchun biz 0 yozdik va ENTER tugmasini bosdik. Bizning bo'luvchimiz 0 ni olganligi sababli, 1/bo'luvchi zeroDivisionError ni ko'tardi. Bizning ikkinchi kiritishimiz k bo'ldi, bu int () uchun yaroqsiz, shuning uchun istisno ValueError ko'tarildi.
Lekin bizning oxirgi kiritishimiz 9 bo'ldi, bu haqiqiy va natijada biz 0,1111111111111111 sifatida chop etilgan “ qiymat ” qiymatini oldik
Nihoyat sinab ko'ringBayonot
Bu, shuningdek, istisnolarni qayta ishlashning ixtiyoriy xususiyati hisoblanadi va istisnolar ishlov beruvchilarida nima sodir bo'lishidan qat'i nazar, har doim ishlaydi.
Ya'ni:
- Istisno sodir bo'ladimi yoki yo'qmi
- Boshqa bloklarda "qaytish" chaqirilsa ham.
- Hatto boshqa bloklarda skript o'chirilgan bo'lsa ham
Demak, agar bizda barcha vaziyatlarda ishlatmoqchi bo'lgan kodimiz bo'lsa, nihoyat blokirovka qilish bizning yigitimizdir. Bu blok asosan fayllarni yopish kabi tozalash uchun ishlatiladi.
Quyidagi misol Python kodini ko'rib chiqing
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)
Ushbu kod text.txt faylini ochishga va o'qishga harakat qiladi. joriy katalogida. Agar fayl mavjud bo'lsa, bizning dasturimiz faylning birinchi qatorini chop etadi, so'ngra bizning final-blokimiz ishga tushadi va faylni yopadi.
Aytaylik, ushbu dastur fayli joylashgan katalogda text.txt nomli fayl bor. bo'ladi va Salom o'z ichiga oladi. Agar biz dasturni ishga tushirsak, biz natijaga ega bo'lamiz
Ushbu misol ataylab tanlangan, chunki men fayllarni yopib qo'yish paytida yuzaga kelishi mumkin bo'lgan kichik muammoni hal qilishimizni xohladim. blok.
Agar fayl mavjud boʻlmasa, istisno FileNotFoundError koʻtariladi va openFile oʻzgaruvchisi aniqlanmaydi va fayl boʻlmaydi. ob'ekt. Demak, uni finally-blokda yopishga urinish UnboundLocalError istisnosini keltirib chiqaradi, bu NameError ning pastki sinfidir.
Bu asosan biz havola qilmoqchi ekanligimizni bildiradi. the