Asosiy mazmunga o'tish

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/except ni faqat kerakli joyda ishlatasiz

Xato 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 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.

Ba’zi xatolarni oldindan bilib bo’lmaydi: foydalanuvchi son o’rniga harf kiritishi mumkin, fayl o’chirilgan bo’lishi mumkin. Shunday joylarda try/except ishlatiladi.

himoya.py
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.

VS 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.

Avval o'ylang: bu kod nima chiqaradi? Ishga tushirishdan oldin yozing.

Bashorat qiling
sonlar = [1, 2, 3]print(sonlar[3])
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.

Bashorat qiling
try:  son = int("abc")except ValueError:  son = 0print(son)
Javobni ko'rish
0

int(«abc») ValueError beradi, except uni ushlaydi va son ga 0 yozadi. Programma to'xtamaydi.

Uch 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.

Bu kod ataylab buzuq — xatoni toping

Buzuq kod
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:

tuzatilgan.py
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.

1Traceback 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 — 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.