Sobes.tech
Middle

Hoe werken geneste uitzonderingen in Python?

sobes.tech AI

Antwoord van AI

Geneste uitzonderingen, ook bekend als exception chaining, maken het mogelijk om informatie over de vorige uitzondering te behouden wanneer een nieuwe optreedt. Dit is handig voor debugging en het begrijpen van de oorzaken van fouten.

In Python 3 worden bij het ontstaan van een nieuwe uitzondering binnen een except of finally blok de oorspronkelijke uitzondering automatisch gekoppeld aan de nieuwe.

Deze koppeling wordt opgeslagen in het attribuut __cause__ van de nieuwe uitzondering.

Expliciete koppeling kan worden gedaan met het sleutelwoord raise from.

# Voorbeeld van automatische koppeling
def divide(a, b):
    try:
        return a / b
    except TypeError:
        # Tijdens het afhandelen van TypeError kan een andere uitzondering optreden
        # De oorspronkelijke uitzondering (TypeError) wordt gekoppeld aan de nieuwe
        raise ValueError("Ongeldig operandtype")

try:
    divide("a", 0)
except ValueError as e:
    # e.__cause__ bevat een TypeError
    print(f"Fout: {e}")
    if e.__cause__:
        print(f"Oorzaak: {e.__cause__}")

print("-" * 20)

# Voorbeeld van expliciete koppeling met raise from
class CustomError(Exception):
    pass

def tricky_function():
    try:
        # Poging tot delen door nul, veroorzaakt ZeroDivisionError
        result = 1 / 0
    except ZeroDivisionError as original_exc:
        # Maak een nieuwe uitzondering en koppel deze aan de originele
        raise CustomError("Fout bij berekening") from original_exc

try:
    tricky_function()
except CustomError as e:
    # e.__cause__ bevat ZeroDivisionError
    print(f"Fout: {e}")
    if e.__cause__:
        print(f"Oorzaak: {e.__cause__}")

print("-" * 20)

# Onderdrukking van koppeling met raise ... from None
try:
    try:
        # Oorspronkelijke uitzondering
        raise ValueError("Oorspronkelijke fout")
    except ValueError:
        # Tijdens het afhandelen van ValueError treedt een andere uitzondering op,
        # maar de koppeling wordt onderdrukt
        raise TypeError("Nieuwe fout") from None
except TypeError as e:
    # e.__cause__ is hier None
    print(f"Fout: {e}")
    if e.__cause__ is None:
        print("Geen oorzaak gespecificeerd.")

Het sleutelwoord raise zonder argumenten heropent de laatste uitzondering.

# Voorbeeld van hernieuwen van een uitzondering
def process_data(data):
    try:
        # Stel dat hier iets mis kan gaan
        if not data:
            raise ValueError("Ontbrekende gegevens")
        print("Gegevens verwerkt")
    except ValueError:
        print("ValueError opgevangen")
        # Herhaal dezelfde uitzondering
        raise

try:
    process_data("")
except ValueError as e:
    print(f"Herhaald opgetilde uitzondering: {e}")

Geneste uitzonderingen verbeteren de leesbaarheid van foutpaden en helpen om sneller de oorzaak van het probleem te lokaliseren.