Sobes.tech
Middle

Чӣ тавр кор мекунанд истисноҳои дарунсохт дар Python?

sobes.tech AI

Ҷавоб аз AI

Воҳидҳои изофӣ, ки ба онҳо пайвандии изофӣ ё пайвандии сатрӣ низ мегӯянд, имкон медиҳанд, ки маълумоти дар бораи изофаи қаблӣ ҳангоми пайдоиши изофаи нав нигоҳ дошта шавад. Ин барои ташхиси хатогӣ ва фаҳмидани сабабҳои хатогӣ кӯмак мекунад.

Дар Python 3, вақте ки изофаи нав дар дохили блоки except ё finally пайдо мешавад, изофаи аслӣ автоматӣ бо он пайваст мешавад.

Ин пайванд дар хосият __cause__и изофаи нав нигоҳ дошта мешавад.

Пайвасти равшанро бо истифода аз калимаи калидии raise from иҷро кардан мумкин аст.

# Намунаи пайвасти автоматӣ
def divide(a, b):
    try:
        return a / b
    except TypeError:
        # Дар вақти коркарди TypeError метавонад изофаи дигар пайдо шавад
        # Изофаи аслӣ (TypeError) бо изофаи нав пайваст мешавад
        raise ValueError("Намуди нодурусти амалҳо")

try:
    divide("a", 0)
except ValueError as e:
    # e.__cause__ дар ин ҷо ZeroDivisionError хоҳад буд
    print(f"Хатогӣ рӯй дод: {e}")
    if e.__cause__:
        print(f"Зимни: {e.__cause__}")

print("-" * 20)

# Намунаи пайвасти равшан бо raise from
class CustomError(Exception):
    pass

def tricky_function():
    try:
        # кӯшиши тақсим ба нул, ZeroDivisionError-ро ба вуҷуд меорад
        result = 1 / 0
    except ZeroDivisionError as original_exc:
        # Эҷоди изофаи нав ва пайваст кардани он бо аслӣ
        raise CustomError("Хатогӣ дар ҳисоббарорӣ") from original_exc

try:
    tricky_function()
except CustomError as e:
    # e.__cause__ дар ин ҷо ZeroDivisionError хоҳад буд
    print(f"Хатогӣ рӯй дод: {e}")
    if e.__cause__:
        print(f"Зимни: {e.__cause__}")

print("-" * 20)

# пинҳон кардани пайванд бо истифода аз raise ... from None
try:
    try:
        # Изофаи аслӣ
        raise ValueError("Хатои аслӣ")
    except ValueError:
        # Дар вақти коркарди ValueError изофаи дигар пайдо мешавад,
        # аммо пайванд пинҳон мешавад
        raise TypeError("Хатои нав") from None
except TypeError as e:
    # e.__cause__ дар ин ҷо None хоҳад буд
    print(f"Хатогӣ рӯй дод: {e}")
    if e.__cause__ is None:
        print("Сабаб зикр нашудааст.")

Калимаи калидии raise бе аргументҳо изофаи охиринро такрор мекунад.

# Намунаи такрори изофаи изо
def process_data(data):
    try:
        # Гумон мекунем, ки дар ин ҷо метавонад хатогӣ рух диҳад
        if not data:
            raise ValueError("Маълумот нест")
        print("Маълумот коркард шуд")
    except ValueError:
        print("Масъалаи ValueError-ро гирифтем")
        # Ҳамон изофаро такрор мекунем
        raise

try:
    process_data("")
except ValueError as e:
    print(f"Масъалаи такроршуда: {e}")

Изофҳои дарунсохт ба хондани пайдарпайии хатогӣ беҳтарӣ мебахшанд ва кӯмак мекунанд, ки сабаби аслӣ зудтар муайян карда шавад.