Sobes.tech
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}")

Ներքևային արտահայտությունները բարելավում են սխալի трасսավորման ընթերցելիությունը և օգնում արագ հայտնաբերել խնդրի հիմնական պատճառը: