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

ඇතුළත් කළ අක්තපත්‍ර මාර්ගෝපදේශනයේ කියවීම වැඩි කරයි සහ ගැටලුවේ මුල් හේතුව වේගයෙන් හඳුනා ගැනීමට උපකාරී වේ.