Middle
Ինչպես են աշխատում ներքին արտահայտությունները Python-ում?
sobes.tech AI
Պատասխան AI-ից
Ներքևային արտահայտությունները, որոնք նաև հայտնի են որպես արտահայտությունների շղթա, թույլ են տալիս պահպանել նախորդ արտահայտության մասին տեղեկատվությունը նոր արտահայտության առաջացման ժամանակ: Սա օգտակար է սխալի ախտորոշման և պատճառների հասկանալու համար:
Python 3-ում, երբ նոր արտահայտություն է առաջանում except կամ finally բլոկում, նախորդ արտահայտությունը ավտոմատ կերպով կապվում է նորի հետ:
Այս կապը պահվում է __cause__ հատկության մեջ:
Ապացույցային կապը կարող է կատարվել raise from բանալի բառի միջոցով:
# Ավտոմատ կապի օրինակ
def divide(a, b):
try:
return a / b
except TypeError:
# TypeError-ի մշակման ժամանակ կարող է առաջանալ այլ արտահայտություն
# Առաջին արտահայտությունը (TypeError) կապվում է նորի հետ
raise ValueError("Սխալ տիպի օպերանդներ")
try:
divide("a", 0)
except ValueError as e:
# e.__cause__ կպահպանի ZeroDivisionError-ը
print(f"Սխալը տեղի ունեցավ: {e}")
if e.__cause__:
print(f"Հարցը՝: {e.__cause__}")
print("-" * 20)
# Մասնավոր կապ [`raise from`](https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement)
class CustomError(Exception):
pass
def tricky_function():
try:
# Զրոյով բաժանում, առաջացնում է ZeroDivisionError
result = 1 / 0
except ZeroDivisionError as original_exc:
# Նոր արտահայտություն ստեղծում և կապում է նախորդի հետ
raise CustomError("Հաշվարկի սխալ") from original_exc
try:
tricky_function()
except CustomError as e:
# e.__cause__ կպահպանի ZeroDivisionError-ը
print(f"Սխալը տեղի ունեցավ: {e}")
if e.__cause__:
print(f"Հարցը՝: {e.__cause__}")
print("-" * 20)
# Կապը թաքցնել [`raise ... from None`](https://docs.python.org/3/reference/simple_stmts.html#the-raise-statement)
try:
try:
# Առաջին արտահայտություն
raise ValueError("Առաջին սխալ")
except ValueError:
# Մշակման ժամանակ առաջանում է այլ արտահայտություն,
# բայց կապը թաքնվում է
raise TypeError("Նոր սխալ") from None
except TypeError as e:
# e.__cause__ այստեղ կլինի None
print(f"Սխալը տեղի ունեցավ: {e}")
if e.__cause__ is None:
print("Պատճառը նշված չէ.")
Բանալի բառ raise առանց արգումենտների կրկին բարձրացնում է վերջին արտահայտությունը:
# Օրինակ՝ արտահայտության կրկնակի բարձրացում
def process_data(data):
try:
# Կարծում ենք, որ այստեղ ինչ-որ բան կարող է սխալ լինել
if not data:
raise ValueError("Տվյալներ բացակայում են")
print("Տվյալները մշակվել են")
except ValueError:
print("Մենք բռնեցինք ValueError")
# նույն արտահայտությունը կրկին բարձրացնել
raise
try:
process_data("")
except ValueError as e:
print(f"Կրկին բարձրացված արտահայտություն: {e}")
Ներքևային արտահայտությունները բարելավում են սխալի трасսավորման ընթերցելիությունը և օգնում արագ հայտնաբերել խնդրի հիմնական պատճառը: