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

Ичке киргизилген чыгымдар катанын трассасын окууга жеңилдик берет жана көйгөйдүн негизги себебин тез аныктоого жардам берет.