Xatoliklarni boshqarish bilan tanishish
Oldingi darsda biz Python xatoliklari haqida bilib oldik. Xatoliklar dastur bajarilishini g'ayritabiiy ravishda tugatishini bilamiz.
Xatoliklar dastur bajarilishini g'ayritabiiy ravishda tugatgani uchun, xatoliklarni boshqarish muhim. Pythonda xatoliklarni boshqarish uchun try...except blokidan foydalanamiz.
try...except bloki Pythonda xatoliklarni boshqarish uchun ishlatiladi. Mana try...except blokining sintaksisi:
try:
# xatolikka sabab bo'lishi mumkin bo'lgan kod
except:
# xatolik yuz berganda ishga tushadigan kod
Bu yerda, xatolik keltirib chiqarishi mumkin bo'lgan kodni try bloki ichiga joylashtirdik. Har bir try blokidan keyin except bloki keladi.
Xatolik yuz berganda, u except bloki tomonidan ushlanadi. except bloki try blokisiz ishlatilishi mumkin emas.
Misol: try...except yordamida xatolikni boshqarish
try:
numerator = 10
denominator = 0
result = numerator/denominator
print(result)
except:
print("Error: Denominator cannot be 0.")
# Natija: Error: Denominator cannot be 0.
Bu misolda, biz sonni 0ga bo'lishga urinyapmiz. Bu yerda, bu kod xatolikni keltirib chiqaradi.
Xatolikni boshqarish uchun, biz result = numerator/denominator kodini try bloki ichiga joylashtirdik. Endi xatolik yuz berganda, try bloki ichidagi qolgan kod o'tkazib yuboriladi.
except bloki xatolikni ushlaydi va except bloki ichidagi operatorlar bajariladi.
Agar try blokidagi operatorlarning hech biri xatolik keltirib chiqarmasa, except bloki o'tkazib yuboriladi.
Har bir try bloki uchun, nolta yoki undan ortiq except bloki bo'lishi mumkin. Bir nechta except bloklari bizga har bir xatolikni turlicha boshqarish imkonini beradi.
Har bir except blokining argument turi u tomonidan boshqarilishi mumkin bo'lgan xatolik turini ko'rsatadi. Masalan,
try:
even_numbers = [2,4,6,8]
print(even_numbers[5])
except ZeroDivisionError:
print("Denominator cannot be 0.")
except IndexError:
print("Index Out of Bound.")
# Natija: Index Out of Bound
Bu misolda, biz even_numbers nomli ro'yxat yaratdik.
Ro'yxat indeksi 0dan boshlangani uchun, ro'yxatning oxirgi elementi 3-indeksda joylashgan. Quyidagi operatorga e'tibor bering,
print(even_numbers[5])
Bu yerda, biz 5-indeksdagi qiymatga murojaat qilishga urinyapmiz. Shuning uchun, IndexError xatoligi yuz beradi.
try blokida IndexError xatoligi yuz berganda,
ZeroDivisionError xatoligi o'tkazib yuboriladi.IndexError xatoligi ichidagi kod to'plami bajariladi.Ba'zi vaziyatlarda, agar try ichidagi kod bloki hech qanday xatosiz ishlasa, muayyan kod blokini ishga tushirishni xohlashimiz mumkin.
Bunday holatlar uchun, try operatori bilan ixtiyoriy else kalit so'zidan foydalanishingiz mumkin.
Keling, bir misolga qaraymiz:
# juft sonlarning teskarisini (reciprocal) chop etuvchi dastur
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1/num
print(reciprocal)
Natija
Agar toq son uzatsak:
Enter a number: 1
Not an even number!
Agar juft son uzatsak, teskari qiymat hisoblanadi va ko'rsatiladi.
Enter a number: 4
0.25
Biroq, agar 0 uzatsak, ZeroDivisionError olamiz, chunki else ichidagi kod blokini oldingi except boshqarmaydi.
Enter a number: 0
Traceback (most recent call last):
File "<string>", line 7, in <module>
reciprocal = 1/num
ZeroDivisionError: division by zero
Bu yerda, koddagi assert operatori numning juft son ekanligini tekshiradi; agar num toq bo'lsa, u AssertionErrorni tashlaydi, bu esa except blokini ishga tushiradi.
Eslatma: else operatoridagi xatoliklar oldingi except operatorlari tomonidan boshqarilmaydi.
Pythonda, finally bloki xatolik bo'lsa ham, bo'lmasa ham har doim bajariladi.
finally bloki ixtiyoriy. Va, har bir try bloki uchun faqat bitta finally bloki bo'lishi mumkin.
Keling, bir misolni ko'ramiz,
try:
numerator = 10
denominator = 0
result = numerator/denominator
print(result)
except:
print("Error: Denominator cannot be 0.")
finally:
print("This is finally block.")
Natija
Error: Denominator cannot be 0.
This is finally block.
Yuqoridagi misolda, biz try bloki ichida sonni 0ga bo'lyapmiz. Bu yerda, bu kod xatolikni keltirib chiqaradi.
Xatolik except bloki tomonidan ushlanadi. Keyin, finally bloki bajariladi.
Ko'proq o'qing: Python built-in Exception, Python user-defined Exception