Sobes.tech
Middle

Python'da ichki istisnolar qanday ishlaydi?

sobes.tech AI

AIdan javob

Ichki tashlangan xatoliklar, shuningdek, xatoliklarni zanjirlash deb ham ataladi, yangi xatolik yuzaga kelganda avvalgi xatolik haqida ma'lumotlarni saqlash imkonini beradi. Bu xatoliklarni tuzatish va sabablarini tushunishda foydalidir.

Python 3 da, odatda, except yoki finally bloklari ichida yangi xatolik yuzaga kelganda, asl xatolik avtomatik ravishda yangi bilan bog‘lanadi.

Ushbu bog‘lanish __cause__ atributida saqlanadi.

Aniq bog‘lanishni raise from kalit so‘zi yordamida amalga oshirish mumkin.

# Avtomatik bog‘lanish misoli
def divide(a, b):
    try:
        return a / b
    except TypeError:
        # TypeError bilan ishlash davomida boshqa xatolik yuzaga kelishi mumkin
        # Asl xatolik (TypeError) yangi bilan bog‘lanadi
        raise ValueError("Operatsion turlar noto‘g‘ri")

try:
    divide("a", 0)
except ValueError as e:
    # e.__cause__ TypeError ni o‘z ichiga oladi
    print(f"Xato: {e}")
    if e.__cause__:
        print(f"Sababi: {e.__cause__}")

print("-" * 20)

# Aniq bog‘lanish misoli raise from bilan
class CustomError(Exception):
    pass

def tricky_function():
    try:
        # Nolga bo‘lishga urinish, ZeroDivisionError ni chaqiradi
        result = 1 / 0
    except ZeroDivisionError as original_exc:
        # Yangi xatolik yaratish va uni asl bilan bog‘lash
        raise CustomError("Hisoblashda xato") from original_exc

try:
    tricky_function()
except CustomError as e:
    # e.__cause__ ZeroDivisionError ni o‘z ichiga oladi
    print(f"Xato: {e}")
    if e.__cause__:
        print(f"Sababi: {e.__cause__}")

print("-" * 20)

# raise ... from None bilan bog‘lanishni to‘xtatish
try:
    try:
        # Asl xatolik
        raise ValueError("Asl xato")
    except ValueError:
        # ValueError bilan ishlash davomida boshqa xatolik yuzaga keladi,
        # lekin bog‘lanish to‘xtatiladi
        raise TypeError("Yangi xato") from None
except TypeError as e:
    # e.__cause__ bu yerda None bo‘ladi
    print(f"Xato: {e}")
    if e.__cause__ is None:
        print("Sababi ko‘rsatilmagan.")

raise kalit so‘zi argumentlarsiz ishlatilganda, oxirgi yuzaga kelgan xatolikni qayta ko‘targan bo‘ladi.

# Xatolikni qayta ko‘targan misol
def process_data(data):
    try:
        # Bu yerda nimadir noto‘g‘ri bo‘lishi mumkin
        if not data:
            raise ValueError("Ma'lumotlar yo‘q")
        print("Ma'lumotlar ishlov berildi")
    except ValueError:
        print("ValueError ni ushladik")
        # Xatolikni qayta ko‘taramiz
        raise

try:
    process_data("")
except ValueError as e:
    print(f"Qayta ko‘targan xatolik: {e}")

Ichki xatoliklar xatoliklarning izlanishlarini o‘qilishi yaxshilaydi va muammo asosiy sababini tezroq aniqlashga yordam beradi.