Python Try-Except. Xatolarni Boshqarish va Istisnolarni Qayta Ishlash

Python dasturlash tilida Try-Except bloklari va xatolarni boshqarish haqida keng qamrovli qo'llanma, misollar va amaliy mashqlar bilan

So'nggi yangilanish: 2024-12-27

Pythonning muhim qismlaridan biri - Try-Except bloklari va xatolarni boshqarish haqida batafsil o'rganamiz. Bu mavzu har qanday dasturchi uchun juda muhim, chunki xatolarni to'g'ri boshqarish orqali siz yanada ishonchli va barqaror dasturlar yaratishingiz mumkin.

Try-Except Bloklari Nima?

Try-Except bloklari - bu Python'da xatolarni boshqarish va istisnolarni (exceptions) qayta ishlash uchun ishlatiladigan konstruktsiyalardir. Ular dastur bajarilishi davomida yuzaga kelishi mumkin bo'lgan xatolarni "ushlash" va ularga mos ravishda javob berish imkonini beradi.

Try-Except Bloklarining Asosiy Sintaksisi

try:
    # Xato yuzaga kelishi mumkin bo'lgan kod
    ...
except ExceptionTuri:
    # Xato yuz berganda bajariladigan kod
    ...

Bu yerda:

  • try blokida xato yuzaga kelishi mumkin bo'lgan kod joylashadi.
  • except blokida esa, agar xato yuz bersa, bajariladigan kod yoziladi.

Oddiy Misol

Keling, oddiy misol ko'rib chiqaylik:

try:
    son = int(input("Son kiriting: "))
    natija = 10 / son
    print(f"10 / {son} = {natija}")
except ZeroDivisionError:
    print("Nolga bo'lish mumkin emas!")
except ValueError:
    print("Iltimos, faqat son kiriting.")

Bu misolda:

  • Agar foydalanuvchi 0 kiritsa, ZeroDivisionError xatosi yuzaga keladi.
  • Agar foydalanuvchi son bo'lmagan qiymat kiritsa, ValueError xatosi yuzaga keladi.

Bir Nechta Xatolarni Bitta Except Blokida Ushlash

Bir nechta xato turlarini bitta except blokida ushlash mumkin:

try:
    # Xato yuzaga kelishi mumkin bo'lgan kod
    ...
except (TypeError, ValueError, ZeroDivisionError):
    print("Xato yuz berdi!")

Barcha Xatolarni Ushlash

Barcha turdagi xatolarni ushlash uchun Exception sinfidan foydalanish mumkin:

try:
    # Xato yuzaga kelishi mumkin bo'lgan kod
    ...
except Exception as e:
    print(f"Xato yuz berdi: {e}")

Lekin, bu usuldan ehtiyotkorlik bilan foydalanish kerak, chunki u kutilmagan xatolarni ham "yutib" yuborishi mumkin.

Else va Finally Bloklari

Try-Except konstruktsiyasida else va finally bloklarini ham qo'shish mumkin:

try:
    x = int(input("Son kiriting: "))
    natija = 10 / x
except ZeroDivisionError:
    print("Nolga bo'lish mumkin emas!")
except ValueError:
    print("Noto'g'ri qiymat kiritildi.")
else:
    print(f"Natija: {natija}")
finally:
    print("Dastur tugadi.")
  • else bloki faqat try blokida xato yuz bermasa bajariladi.
  • finally bloki har doim bajariladi, xato yuz bergan yoki bermaganidan qat'i nazar.

Xatolarni Qayta Ko'tarish (Re-raising Exceptions)

Ba'zida xatoni ushlagandan so'ng, uni qayta ko'tarish (re-raise) qilish kerak bo'ladi:

try:
    # Xato yuzaga kelishi mumkin bo'lgan kod
    ...
except SomeException:
    # Xatoni qayta ishlash
    ...
    raise  # Xatoni qayta ko'tarish

O'z Xato Sinflaringizni Yaratish

Siz o'zingizning xato sinflaringizni ham yaratishingiz mumkin:

class MeningXatoyim(Exception):
    pass

def funksiya(x):
    if x < 0:
        raise MeningXatoyim("Manfiy son kiritish mumkin emas")

try:
    funksiya(-5)
except MeningXatoyim as e:
    print(f"Xato: {e}")

Amaliy Misol: Fayl Bilan Ishlash

Keling, fayl bilan ishlashda Try-Except bloklaridan foydalanishni ko'rib chiqaylik:

def faylni_oqi(fayl_nomi):
    try:
        with open(fayl_nomi, 'r') as fayl:
            matn = fayl.read()
            print(matn)
    except FileNotFoundError:
        print(f"'{fayl_nomi}' nomli fayl topilmadi.")
    except PermissionError:
        print(f"'{fayl_nomi}' faylini o'qish uchun ruxsat yo'q.")
    except Exception as e:
        print(f"Kutilmagan xato yuz berdi: {e}")
    else:
        print("Fayl muvaffaqiyatli o'qildi.")
    finally:
        print("Fayl bilan ishlash tugadi.")

# Foydalanish
faylni_oqi("mavjud_emas.txt")
faylni_oqi("mavjud.txt")

Bu misolda biz turli xil xatolarni ko'rib chiqdik: fayl topilmaganda, faylni o'qish uchun ruxsat bo'lmaganda va boshqa kutilmagan xatolar yuz berganda.

Context Manager Bilan Try-Except

Python'da with operatori orqali context manager'lardan foydalanish Try-Except bloklarini yanada samarali qilishi mumkin:

def faylga_yoz(fayl_nomi, matn):
    try:
        with open(fayl_nomi, 'w') as fayl:
            fayl.write(matn)
    except PermissionError:
        print(f"'{fayl_nomi}' fayliga yozish uchun ruxsat yo'q.")
    except Exception as e:
        print(f"Xato yuz berdi: {e}")
    else:
        print("Fayl muvaffaqiyatli yozildi.")

# Foydalanish
faylga_yoz("yangi_fayl.txt", "Salom, dunyo!")

Bu usul faylni avtomatik ravishda yopishni ta'minlaydi, hatto xato yuz berganda ham.

Xatolarni Logging Qilish

Katta loyihalarda xatolarni shunchaki ekranga chiqarish yetarli emas. Bunday hollarda logging modulidan foydalanish maqsadga muvofiq:

import logging

logging.basicConfig(filename='xatolar.log', level=logging.ERROR)

def xavfli_operatsiya():
    try:
        # Xavfli kod
        x = 1 / 0
    except Exception as e:
        logging.error(f"Xato yuz berdi: {e}", exc_info=True)

xavfli_operatsiya()

Bu kod xatoni xatolar.log fayliga yozadi, bu esa keyinchalik xatolarni tahlil qilish uchun juda foydali.

Tez-tez So'raladigan Savollar (TSS)

  1. S: Nima uchun Try-Except bloklaridan foydalanish kerak? J: Try-Except bloklari dasturingizni yanada barqaror qiladi. Ular kutilmagan xatolar tufayli dastur to'xtab qolishining oldini oladi va foydalanuvchiga do'stona xabarlar ko'rsatish imkonini beradi.
  2. S: Har doim barcha xatolarni ushlash kerakmi? J: Yo'q, faqat kutilgan va boshqarish mumkin bo'lgan xatolarni ushlash kerak. Barcha xatolarni ushlab qolish dasturda jiddiy muammolarni yashirishi mumkin.
  3. S: Try-Except bloklarining ishlash tezligiga ta'siri qanday? J: Try-Except bloklari o'zlari sezilarli darajada ishlash tezligiga ta'sir qilmaydi. Biroq, ular ichidagi kod tez-tez xatolarga duch kelsa, bu ishlash tezligini pasaytirishi mumkin.
  4. S: Qachon o'z xato sinflarimni yaratishim kerak? J: O'z xato sinflaringizni yaratish dasturingizga xos bo'lgan xatolarni aniqroq ifodalash va boshqarish imkonini beradi. Bu ayniqsa katta loyihalarda foydali.
  5. S: Finally blokidan nima uchun foydalanish kerak? J: Finally bloki xato yuz bergan yoki bermaganidan qat'i nazar, bajarilishi kerak bo'lgan kodni joylashtirish uchun ishlatiladi. Bu, masalan, ochilgan fayllarni yopish yoki ma'lumotlar bazasi ulanishlarini uzish uchun foydali.
  6. S: Except Exception as e: yozish yaxshi amaliyotmi? J: Bu usul barcha xatolarni ushlaydi, lekin bu har doim ham yaxshi amaliyot emas. Aniq xato turlarini ushlash va ularga mos ravishda javob berish yaxshiroq. Umumiy Exception faqat oxirgi chorada ishlatilishi kerak.
  7. S: Try-Except bloklarini qanday testlash mumkin? J: Try-Except bloklarini testlash uchun unittest yoki pytest kabi test frameworklaridan foydalanish mumkin. Siz ataylab xatolar keltirib chiqaradigan testlar yozishingiz va ular to'g'ri ushlanganligini tekshirishingiz mumkin.
  8. S: Xatolarni qayta ko'tarish (re-raising) nima uchun kerak? J: Xatolarni qayta ko'tarish xatoni qayta ishlash va keyin uni yuqori darajadagi xatolarni boshqaruvchiga uzatish imkonini beradi. Bu xatoni qisman boshqarish va keyin uni tizimning boshqa qismlariga xabar berish uchun foydali.
  9. S: Try-Except va if-else o'rtasidagi farq nima? J: Try-Except kutilmagan holatlarni boshqarish uchun ishlatiladi, if-else esa kutilgan holatlarni tekshirish uchun. Try-Except bloklari dastur ishlashiga sezilarli ta'sir qilishi mumkin, shuning uchun ularni faqat zarur bo'lganda ishlatish kerak.
  10. S: Nested (ichma-ich) Try-Except bloklaridan foydalanish mumkinmi? J: Ha, nested Try-Except bloklaridan foydalanish mumkin, lekin bu kodning murakkabligini oshiradi. Iloji bo'lsa, xatolarni alohida funksiyalarga ajratish va har bir funksiyada o'z Try-Except bloklaridan foydalanish yaxshiroq.

Xulosa

Try-Except bloklari Python dasturlashda xatolarni boshqarishning asosiy vositasidir. Ular dasturlaringizni yanada ishonchli va foydalanuvchilarga do'stona qiladi. Xatolarni to'g'ri boshqarish orqali siz kutilmagan vaziyatlarga tayyorlanasiz va dasturingizning sifatini oshirasiz.

Try-Except bloklaridan to'g'ri foydalanish uchun quyidagi maslahatlarni yodda tuting:

  1. Faqat aniq xato turlarini ushlang.
  2. Xato xabarlarini aniq va foydali qiling.
  3. Xatolarni logging qilishni unutmang.
  4. Context manager'lardan foydalaning (with operatori).
  5. O'z xato sinflaringizni yarating, agar bu dasturingiz uchun mantiqli bo'lsa.

Xatolarni boshqarish - bu san'at. Amaliyot va tajriba orqali siz Try-Except bloklaridan yanada samarali foydalanishni o'rganasiz. Yaxshi dasturlashda davom eting!

Qo'shimcha Manbalar

  1. Python Rasmiy Hujjatlari - Xatolarni Boshqarish
  2. Real Python - Python Exception Handling
  3. Python Tips - Exception Handling

Amaliy Mashqlar

Endi bilimlaringizni mustahkamlash uchun bir nechta amaliy mashqlarni bajarib ko'ring:

  1. Foydalanuvchidan ikki son kiritishini so'rang va ularni bo'lishga harakat qiling. Barcha mumkin bo'lgan xatolarni (nolga bo'lish, noto'g'ri qiymat kiritish) boshqaring.
  2. Fayl nomini so'rab, uni o'qishga harakat qiling. Fayl mavjud bo'lmasa yoki o'qish huquqi bo'lmasa, tegishli xabarlarni chiqaring.
  3. JSON formatidagi ma'lumotlarni o'qiydigan va ularni Python lug'atiga aylantiradigan funksiya yozing. JSON xatolarini boshqaring.
  4. Internetdan ma'lumotlarni yuklab oladigan funksiya yozing (masalan, requests kutubxonasidan foydalanib). Tarmoq xatolarini va boshqa mumkin bo'lgan xatolarni boshqaring.
  5. O'zingizning xato sinfingizni yarating va uni real hayotdagi misolda qo'llang (masalan, bank hisobi bilan ishlashda mablag' yetishmasligi xatosi).