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.