Xatolarni boshqarish (Try Except) — havaskor dasturchini professionaldan ajratib turadigan mavzu. Har qanday dastur xato bilan uchrashadi: foydalanuvchi noto’g’ri ma’lumot kiritadi, fayl topilmaydi, internet uziladi. Yaxshi dastur bunda “qulab tushmaydi”, balki xatoni ushlab, oqilona javob beradi.
Istisno (exception) — dastur ishlashi davomida yuzaga keladigan xato holati.
try-exceptkonstruksiyasi bunday xatoni ushlab, dasturning butunlay to’xtab qolishining oldini oladi.
Muammo: ushlanmagan xato
Avval xatosiz dastur qanday “qulashini” ko’ramiz. Nolga bo’lishga urinaylik:
son = 10
print(son / 0)
print("Bu qator ishlamaydi")
ZeroDivisionError: division by zero
Dastur ZeroDivisionError bilan to’xtadi va oxirgi print umuman ishlamadi. Real ilovada bu — butun sahifaning ishdan chiqishi demakdir. Buni oldini olishimiz kerak.
Yechim: try — except
try blokiga xavfli kodni, except blokiga esa xato yuz berganda bajariladigan kodni yozamiz:
try:
son = 10
print(son / 0)
except ZeroDivisionError:
print("Xato: nolga bo'lish mumkin emas")
print("Dastur davom etmoqda")
Xato: nolga bo'lish mumkin emas
Dastur davom etmoqda
Mana farqi: dastur qulamadi, xatoni “ushlab”, tushunarli xabar berdi va ishini davom ettirdi. Aynan shu — barqaror dasturning belgisi.
Turli xatolarni alohida ushlash
Har xil xato turini alohida ushlash mumkin. Keng tarqalgan xato turlarini jadvalda ko’ramiz:
| Xato turi | Qachon yuz beradi |
|---|---|
ZeroDivisionError |
nolga bo’lishda |
ValueError |
noto’g’ri qiymatda |
TypeError |
mos kelmaydigan turda |
KeyError |
lug’atda kalit yo’q bo’lsa |
FileNotFoundError |
fayl topilmasa |
Amalda bir necha except yozish mumkin:
try:
yosh = int("salom")
except ValueError:
print("Xato: butun son kiriting")
except ZeroDivisionError:
print("Xato: nolga bo'lish")
Xato: butun son kiriting
"salom" ni songa aylantirib bo’lmagani uchun ValueError yuz berdi va aynan shu blok ishladi. Python xato turiga mos except ni o’zi tanlaydi.
else va finally
try konstruksiyasining to’liq shakli yana ikki blokka ega. else — xato bo’lmaganda, finally — har qanday holatda (xato bo’ladimi-yo’qmi) bajariladi:
try:
natija = 10 / 2
except ZeroDivisionError:
print("Xato yuz berdi")
else:
print("Natija:", natija)
finally:
print("Amal yakunlandi")
Natija: 5.0
Amal yakunlandi
finally bloki ayniqsa muhim — u fayl yopish, ulanishni tugatish kabi “tozalash” ishlarini har qanday holatda kafolatlaydi.
Amaliy misol: xavfsiz kiritish
Xatolarni boshqarish real hayotda foydalanuvchi ma’lumotini tekshirishda ishlatiladi:
def narxni_olish(matn):
try:
return float(matn)
except ValueError:
return 0
print(narxni_olish("15000"))
print(narxni_olish("noto'g'ri"))
15000.0
0
Bu naqsh foydalanuvchi kiritgan narxni xavfsiz qabul qilishda bebaho. Xato bo’lsa, dastur qulamaydi, oqilona standart qiymat qaytaradi.
Xulosa
Bu darsda try-except bilan xatoni ushlash, turli xato turlarini ajratish, else va finally bloklari hamda xavfsiz kiritishni o’rgandik. Xatolarni boshqarish — barqaror, ishonchli dastur yozishning kalitidir. Keyingi darsda fayllar bilan ishlashga kirib boramiz.