حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش دیباگ و تست‌نویسی در پایتون؛ رفع خطا با تمرین

آموزش except مشخص در پایتون؛ مدیریت ValueError بدون پوشاندن TypeError

استثناهای رایج پایتون و مدیریت دقیق خطا · 0٪

وقتی یک نوع شکست قابل انتظار داریم، except رو به همان نوع محدود می‌کنیم. یک except خیلی کلی می‌تونه باگ برنامه‌نویسی رو هم به جواب ظاهراً عادی تبدیل کنه. برای تبدیل متن عددی، ValueError یعنی رشته از نظر مقدار مناسب نیست؛ TypeError می‌تونه یعنی فراخواننده چیزی مثل None داده که قرارداد تابع اصلاً قبول نمی‌کنه.

مثال فقط تبدیل نامعتبر متن رو مدیریت می‌کنه. در تمرین هم همین تفکیک مهمه، اما برای اینکه استثنا در معیار JSON نمایش‌پذیر باشه، یک تابع کمکی آماده داریم. inspect_parse فقط TypeError بیرون‌آمده رو به یک دیکشنری توضیحی تبدیل می‌کنه؛ قرار نیست خود parse_count این خطا رو ببلعه. خطای رایج برگرداندن صفر برای هر Exception است. اون جواب، ورودی نامعتبر متنی رو از اشتباه نوعی فراخواننده غیرقابل تشخیص می‌کنه. try رو هم کوتاه نگه دار تا فقط عملیاتی که انتظار ValueError ازش داری زیر پوشش باشه و مسیر واقعی علت روشن بمونه.

✍️ مثال حل‌شده:

def parse_age(text):
    try:
        return int(text)
    except ValueError:
        return -1

assert parse_age("bad") == -1

حالا نوبت توئه: parse_count(value) باید int(value) را بدهد و فقط ValueError را به 0 تبدیل کند. "12"=>12، "bad"=>0 و "-3"=>-3 است. TypeError برای None باید از تابع بیرون بیاید. inspect_parse آماده را نگه دار؛ خروجی آن برای None برابر {"error":"TypeError"} و برای "bad" برابر {"value":0} خواهد بود.

فعالیت شما

parse_count(value) باید int(value) را بدهد و فقط ValueError را به 0 تبدیل کند. "12"=>12، "bad"=>0 و "-3"=>-3 است. TypeError برای None باید از تابع بیرون بیاید. inspect_parse آماده را نگه دار؛ خروجی آن برای None برابر {"error":"TypeError"} و برای "bad" برابر {"value":0} خواهد بود.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def parse_count(value):
    # تبدیل و مدیریت فقط ValueError
    pass

def inspect_parse(value):
    try:
        return {"value": parse_count(value)}
    except TypeError:
        return {"error": "TypeError"}