Sobes.tech
Middle

Kaip veikia įdėtos išimtys Python?

sobes.tech AI

Atsakymas iš AI

Įdėtiniai išimtys, dar vadinamos išimčių grandine, leidžia išsaugoti informaciją apie ankstesnę išimtį, kai įvyksta nauja. Tai naudinga klaidų taisymui ir priežasčių supratimui.

Python 3, kai nauja išimtis įvyksta except arba finally bloke, originali išimtis automatiškai susiejama su nauja.

Ši sąsaja saugoma __cause__ atributuose.

Tiesioginė sąsaja gali būti padaryta naudojant raktinį žodį raise from.

# Automatinės sąsajos pavyzdys
def divide(a, b):
    try:
        return a / b
    except TypeError:
        # Apdorojant TypeError gali įvykti kita išimtis
        # Pradinė išimtis (TypeError) bus susieta su nauja
        raise ValueError("Neteisingas operandų tipas")

try:
    divide("a", 0)
except ValueError as e:
    # e.__cause__ čia bus ZeroDivisionError
    print(f"Klaida įvyko: {e}")
    if e.__cause__:
        print(f"Kviečiama iš: {e.__cause__}")

print("-" * 20)

# Tiesioginė sąsaja naudojant [`raise from`](https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement)
class CustomError(Exception):
    pass

def tricky_function():
    try:
        # Dalyje dalijimas iš nulio, sukeliantis ZeroDivisionError
        result = 1 / 0
    except ZeroDivisionError as original_exc:
        # Sukuriame naują išimtį ir susiejame ją su originalia
        raise CustomError("Skaičiavimo klaida") from original_exc

try:
    tricky_function()
except CustomError as e:
    # e.__cause__ čia bus ZeroDivisionError
    print(f"Klaida įvyko: {e}")
    if e.__cause__:
        print(f"Kviečiama iš: {e.__cause__}")

print("-" * 20)

# Paslėpti sąsają naudojant [`raise ... from None`](https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement)
try:
    try:
        # Pradinė išimtis
        raise ValueError("Pradinė klaida")
    except ValueError:
        # Apdorojant ValueError įvyksta kita išimtis,
        # tačiau sąsaja paslepiama
        raise TypeError("Nauja klaida") from None
except TypeError as e:
    # e.__cause__ čia bus None
    print(f"Klaida įvyko: {e}")
    if e.__cause__ is None:
        print("Priežastis nepaminėta.")