Sobes.tech
Middle

Hogyan működnek a beágyazott kivételek Pythonban?

sobes.tech MI

Válasz az MI-től

Beágyazott kivételek, más néven kivételsorozat, lehetővé teszik, hogy megőrizzük az előző kivétel információit, amikor egy új keletkezik. Ez hasznos hibakereséshez és a hiba okának megértéséhez.

Python 3-ban alapértelmezés szerint, amikor egy új kivétel keletkezik egy except vagy finally blokkban, az eredeti kivétel automatikusan összekapcsolódik az újjal.

Ez a kapcsolat a __cause__ attribútumban tárolódik az új kivételnél.

A kifejezett összekapcsolás a raise from kulcsszóval hajtható végre.

# Automatikus összekapcsolás példája
def divide(a, b):
    try:
        return a / b
    except TypeError:
        # A TypeError kezelése közben más kivétel is keletkezhet
        # Az eredeti kivétel (TypeError) összekapcsolódik az újjal
        raise ValueError("Hibás operandustípus")

try:
    divide("a", 0)
except ValueError as e:
    # e.__cause__ tartalmazni fogja a TypeError-t
    print(f"Hiba történt: {e}")
    if e.__cause__:
        print(f"Hívás innen: {e.__cause__}")

print("-" * 20)

# Kifejezett összekapcsolás a raise from segítségével
class CustomError(Exception):
    pass

def tricky_function():
    try:
        # Nullával való osztás, ZeroDivisionError-t okoz
        result = 1 / 0
    except ZeroDivisionError as original_exc:
        # Új kivétel létrehozása és összekapcsolása az eredetivel
        raise CustomError("Hiba a számítás során") from original_exc

try:
    tricky_function()
except CustomError as e:
    # e.__cause__ tartalmazni fogja a ZeroDivisionError-t
    print(f"Hiba történt: {e}")
    if e.__cause__:
        print(f"Hívás innen: {e.__cause__}")

print("-" * 20)

# Az összekapcsolás elrejtése a raise ... from None segítségével
try:
    try:
        # Eredeti kivétel
        raise ValueError("Eredeti hiba")
    except ValueError:
        # A ValueError kezelése közben más kivétel keletkezik,
        # de az összekapcsolás el van rejtve
        raise TypeError("Új hiba") from None
except TypeError as e:
    # e.__cause__ itt None lesz
    print(f"Hiba történt: {e}")
    if e.__cause__ is None:
        print("Az ok nem került megadásra.")

A raise kulcsszó argumentum nélkül újra felhozza az utolsó kivételt.

# Kivétel újrafelhozatalának példája
def process_data(data):
    try:
        # Feltételezzük, hogy itt bármi történhet
        if not data:
            raise ValueError("Hiányzó adatok")
        print("Az adatok feldolgozva")
    except ValueError:
        print("ValueError-t fogtunk")
        # Ugyanaz a kivétel újra felhozása
        raise

try:
    process_data("")
except ValueError as e:
    print(f"Újra felhozott kivétel: {e}")

A beágyazott kivételek javítják a hibakeresési útvonalak olvashatóságát és segítenek gyorsabban lokalizálni a probléma eredeti okát.