17-dars: Xatoni topish
5-blokHaqiqiy programma17–20 darslar
Bu darsdan keyin siz
- traceback ni to’g’ri tartibda — pastdan yuqoriga — o’qiysiz
- xato turini o’qib, uni qidirmasdan tushunasiz
try/exceptni faqat kerakli joyda ishlatasiz
Nazariya
“Nazariya” bo'limiga havolaTraceback pastdan yuqoriga o’qiladi
“Traceback pastdan yuqoriga o’qiladi” bo'limiga havolaXato chiqqanda Python bir necha qator chop etadi. Boshlovchi uni yuqoridan o’qiydi, hech narsa tushunmaydi va butun matnni “xato” deb hisoblaydi.
To’g’ri tartib teskari. Eng pastdagi qator — xato turi va sababi. Undan
yuqorisi — xato bergan kod. Keyin fayl va qator raqami. Eng yuqoridagi
Traceback (most recent call last): qatorida esa ma’lumot yo’q.
tracebacktraceback
Xato yuz berganda Python chop etadigan chaqiruvlar zanjiri. U xato QAYERDA sodir bo’lganini ko’rsatadi.
Xato turi allaqachon javob beradi
“Xato turi allaqachon javob beradi” bo'limiga havolaXato turining nomi tashxis qo’yadi. TypeError — mos kelmaydigan turlar (ko’pincha
input() satrini son deb ishlatish). NameError — nom yaratilmagan yoki
xato yozilgan. IndexError — ro’yxatda yo’q indeks. KeyError — lug’atda yo’q
kalit. ZeroDivisionError — bo’luvchi nol. IndentationError — chekinish buzilgan.
Bu ro’yxatni yodlash shart emas: xato chiqqanda uning nomini o’qish yetadi.
try / except — faqat kerakli joyda
“try / except — faqat kerakli joyda” bo'limiga havolaBa’zi xatolarni oldindan bilib bo’lmaydi: foydalanuvchi son o’rniga harf kiritishi
mumkin, fayl o’chirilgan bo’lishi mumkin. Shunday joylarda try/except
ishlatiladi.
try: yosh = int(input("Yoshingiz: ")) print("Keyingi yil:", yosh + 1)except ValueError: print("Iltimos, son kiriting.")Muhim qoida: except da xato turi ko’rsatiladi. Quruq except: yozsangiz,
u har qanday xatoni yutib yuboradi — jumladan sizning kodingizdagi haqiqiy
xatoni ham. Programma “ishlaydi”, lekin noto’g’ri natija beradi.
Debugger — eng tez usul
“Debugger — eng tez usul” bo'limiga havolaVS Code debugger’i 0-darsda sozlangan edi. F5
bilan ishga tushirasiz, qator raqami yonini bosib breakpoint qo’yasiz va
Variables panelida har o’zgaruvchining qiymatini ko’rasiz.
breakpointbreakpoint
Programma to’xtaydigan qator. To’xtagan joyda barcha o’zgaruvchilarning qiymatini ko’rish mumkin.
print bilan tekshirish ham ishlaydi, lekin debugger tezroq: o’nta print
qo’shib, keyin ularni olib tashlashdan ko’ra bitta breakpoint qo’yish arzon.
Bashorat qiling
“Bashorat qiling” bo'limiga havolaAvval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
sonlar = [1, 2, 3]print(sonlar[3])Haqiqiy natija:
IndexError: list index out of range
Uch elementli ro'yxatning indekslari 0, 1, 2. Indeks 3 mavjud emas — bu «bittaga adashish» xatosi va u eng ko'p uchraydiganlardan.
Javobni ko'rish
IndexError: list index out of range
Uch elementli ro'yxatning indekslari 0, 1, 2. Indeks 3 mavjud emas — bu «bittaga adashish» xatosi va u eng ko'p uchraydiganlardan.
Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.
try: son = int("abc")except ValueError: son = 0print(son)Haqiqiy natija:
0
int(«abc») ValueError beradi, except uni ushlaydi va son ga 0 yozadi. Programma to'xtamaydi.
Javobni ko'rish
0
int(«abc») ValueError beradi, except uni ushlaydi va son ga 0 yozadi. Programma to'xtamaydi.
Sinab ko’r
“Sinab ko’r” bo'limiga havolaUch xato turini ketma-ket ko’rib chiqing. Har variantda traceback pastdan yuqoriga o’qiladi — qadamlar aynan shu tartibda boradi.
Traceback o'quvchi
Variantni tanlab qadamlang: traceback pastdan yuqoriga o'qiladi. Klaviatura: → keyingi qadam.
Bu simulyatorda traceback qatorma-qator izohlanadi. Tartib muhim: eng pastdagi qatorda xato turi va sababi, yuqorida esa chaqiruv zanjiri.
JavaScript'siz qoida: traceback ni pastdan boshlab o'qing. Oxirgi qator — xato turi, undan yuqorisi — xato bergan kod, keyin fayl va qator raqami. Eng yuqoridagi «Traceback (most recent call last):» qatorida ma'lumot yo'q.
Kod
Terminal chiqishi
Uchinchi variantga alohida e’tibor bering: u tracebackning chegarasini
ko’rsatadi. Xato sikl ichida, lekin traceback qaysi aylanishda ekanini aytmaydi
— buni ekranga chiqqan 4.5 sonidan topish kerak.
Xatoni toping
“Xatoni toping” bo'limiga havolaBu kod ataylab buzuq — xatoni toping
def yosh_ol(): try: return int(input("Yoshingiz: ")) except: return 0print(yosh_ol() + 1)Python shunday javob beradi:
(Xato chiqmaydi — muammo aynan shunda)
Sababi va tuzatish
Quruq except: har qanday xatoni yutadi. Foydalanuvchi Ctrl+C bosib programmani to'xtatmoqchi bo'lsa ham, u 0 qaytaradi — va siz nima bo'lganini bilmaysiz.
Bu xato “ko’rinmaydigan” turdan: programma ishlaydi, xato chiqmaydi, natija esa yolg’on. Tuzatish — xato turini aniq ko’rsatish:
def yosh_ol(): try: return int(input("Yoshingiz: ")) except ValueError: print("Son kiriting.") return 0print(yosh_ol() + 1)Qoida: except hech qachon bo’sh qoldirilmaydi va u faqat siz kutgan
xatoni ushlaydi. Kutilmagan xato chiqishi kerak — u sizga muammo borligini
aytadi.
O’zingizni sinang
“O’zingizni sinang” bo'limiga havola1Traceback ni qaysi qatordan o'qishni boshlaysiz?
Javobni ko'rish
Eng pastdagi qatordan — u yerda xato turi va sababi. Yuqoridagi qatorlar chaqiruv zanjirini ko’rsatadi.
2TypeError: can only concatenate str (not «int») to str — nima bo'lgan?
Javobni ko'rish
Satrga son qo’shilgan. Ko’pincha sabab bitta: input() satr qaytargan va
int() ga o’girilmagan.
3Traceback sikl ichidagi xatoda qaysi aylanish ekanini aytadimi?
Javobni ko'rish
Yo’q. Buni xatodan oldin ekranga chiqqan natijaga qarab aniqlash kerak.
4Nega quruq except: yozilmaydi?
Javobni ko'rish
U har qanday xatoni yutadi, jumladan sizning kodingizdagi haqiqiy xatoni ham. Programma ishlaganday ko’rinadi, natija esa yolg’on bo’ladi.
5Debugger print dan nimasi bilan afzal?
Javobni ko'rish
Bitta breakpoint qo’yib barcha o’zgaruvchilarni bir vaqtda ko’rish mumkin.
print bilan esa har o’zgaruvchi uchun alohida qator yozib, keyin ularni
o’chirish kerak.
Topshiriq
“Topshiriq” bo'limiga havolaTopshiriq — darajangizni tanlang
Asos · 5–7-sinf — Vizual va aniq ko'rsatmali
Uchta xatoni ataylab chiqaring: IndexError, NameError, ZeroDivisionError.
Har traceback ni daftaringizga ko’chirib, uch qismini belgilang: xato turi,
xato bergan kod, qator raqami.
Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz
Foydalanuvchidan son so’raydigan programma yozing va uni try/except bilan
himoyalang. Keyin uni buzishga urinib ko’ring: harf kiriting, bo’sh qoldiring,
manfiy son kiriting. Har holat uchun programma nima qilishi kerakligini
oldindan hal qilib, keyin kodga yozing.
Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan
Oldingi darslardagi programmalaringizdan birini oling va unda VS Code
debugger’i bilan ishlang: breakpoint qo’yib, Variables panelini kuzatib
bitta xatoni toping. Keyin xuddi shu xatoni print bilan izlab ko’ring va
ikki usulni solishtiring — qaysi biri qancha vaqt oldi va nega.
Darsni belgilash uchun JavaScript kerak. Bu progressni saqlash uchun ishlatiladi — darslikning o'zi JavaScript'siz ham to'liq o'qiladi.