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.