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.
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.
O'zgaruvchi, funktsiya, obyekt nomini noto'g'ri yozish natijasida kelib chiquvchi xatolik.
|
prit("Hello World!") |
NameError: name 'prit' is not defined |
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' |
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.
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.
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.