• Savolingiz bormi?
  • +998 97 534 03 20
  • turayev.ruziboy@bk.ru
 16. XATOLAR VA ISTISNOLAR BILAN ISHLASH

16. XATOLAR VA ISTISNOLAR BILAN ISHLASH

Python / 2021-12-19

Run time error — dastur bajarish jarayonida kelib chiqadi va dasturning ishlashini to'xtatadi. Sintaks xatolikdan farqli ravishda Python bunday xatolarni dasturni bajarishdan avval aniqlay olmaydi. Run time error ning bir necha turi bor. Keling, ulardan ba'zilari bilan tanishamiz.

TypeError

Biror amalni (funktsiya, metod) noto'g'ri ma'lumot turi ustida bajarish.

TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

 

Yuqoridagi kodda biz foydalanuvchi kiritgan qiymatni matndan songa o'tkazib olishni unutdik, natijada sonning kvadratini hisoblashda Python xato berdi.

NameError

O'zgaruvchi, funktsiya, obyekt nomini noto'g'ri yozish natijasida kelib chiquvchi xatolik.

 

prit("Hello World!")

NameError: name 'prit' is not defined

ValueError

Funktsiyaga noto'g'ri qiymatni yuborish natijasidagi xatolik

Istalgan son kiriting: 2.5

Traceback (most recent call last):

  son = int(input("Istalgan son kiriting: "))

ValueError: invalid literal for int() with base 10: '2.5'

IndexError

Yangi dasturchilar yo'l qo'yadigan yana bir xato bu indeks xatolik. Ya'ni ro'yxat elementlariga murojat qilishda indeksni noto'g'ri kiritish.

 

IndexError: list index out of range

 

Bizda mevalar degan ro'yxat bor va ro'yxatda uchta meva bor. Biz 3-elementni konsolga chiqarmoqchimiz va print(mevalar[3]) deb yozdik va IndexError natijasini oldik. Sababi, dasturlashda indeks 0 dan boshlanadi va 3-elementga murojat qilish uchun 2-indeksni tanlaymiz.

Ushbu darsimizda qanday qilib mana shunday xatoliklarni jilovlashni o'rganamiz. Maqsadimiz xatolik yuz berganda dastur to'xtab qolishining oldini olish. Gap shundaki, dastur davomida xato yuz berganda Python maxsus exception (istisno) obyektini yaratadi. Agar bu obyekt "tutib" olinmasa, dastur bajarilishdan to'xtaydi.

try-except

Istisno obyektlarni tutib olish uchun Pythonda maxsus try-except operatorlari bor. Bu operatorlar quyidagicha ishlaydi, try operatori badanida bajarish kerak bo'lgan kod yoziladi, except operatori badanida esa xatolik yuz berganda bajarilishi kerak bo'lgan kod yoziladi. Ya'ni dasturimiz to'xtab qolmasdan bajarilaveradi.

Tushunarli bo'lishi uchun quyidagi misolni ko'ramiz.

Yoshingizni kiriting: 36.2

Traceback (most recent call last):

  File "C:/Users/SAMSUNG001/AppData/Local/Programs/Python/Python38-32/13.py", line 2, in

    yosh = int(yosh)

ValueError: invalid literal for int() with base 10: '36.2'

 

Yuqoridagi misolning 1-qatorida biz foydalanuvchidan yoshini kiritishni so'rayabmiz. Navbatdagi qatorda esa foydalanuvchi kiritgan qiymatni int() yordamida butun songa o'tkazayapmiz. Agar foydalanuvchi yoshini kiritganda, butun emas, o'nlik son kiritsa bu ValueError xatoligiga olib keladi, va dastur bajarilishdan to'xtaydi.

 

Keling, yuqoridagi kodni try-except yordamida yozamiz:

Yoshingizni kiriting: 32.2

Butun son kiritmadingiz

Dastur Tugadi!

 

Bu yerda ham dastavval foydalanuvchi yoshini so'radik. int() finksiyasini esa try badani ichida yozdik, agar foydalanuvchi to'gri qiymat kiritgan bo'lsa kodimiz foydalanuvchi tug'ilgan yilini hisoblab ko'rsatadi, exception (istisno) yuz berganda esa "Butun son kiritmadingiz" xabarini konsolga chiqaradi. Lekin dastur bajarilishdan to'xtamaydi, va try-except blokidan keyingi qatorlar ham bajarilaveradi (print("Dastur Tugadi!")). Buni quyidagi natijadan ham ko'rishimiz mumkin:

 

try-except operatorining afzalliklaridan biri, foydalanuvchiga tushunarsiz xatolar o'rniga, o'zimiz istagan, tushunarliroq matnni ko'rsatishimiz mumkin. Shuningdek, kompleks tizimlarda arzimagan xatoni deb dasturimiz to'xtab qolmaydi.

try-except-else

Yuqoridagi kodimizda biz try moduli ichida xato qaytarishi mumkin bo'lgan ifodani ham (tyil = int(tyil)), xato qaytmaganda bajarilishi kerak bo'lgan ifodani ham (print(f"Siz {2021-tyil} yoshdasiz") ) birdan yozib ketayapmiz. Aslida, bunday qilishimiz to'g'ri emas.

To'g'ri usuli, bu avval xatoga tekshirish va xato yuz bermaganda bajariladigan ifodani alohida, else blokida yozish:

Yoshingizni kiriting: 36.2

Butun son kiritmadingiz

 

Albatta, yuqoridagi usul har doim ham qo'l kelavermaydi.

 


Izoh qoldirish