وقتی یک نوع شکست قابل انتظار داریم، 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} خواهد بود.