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.")