🗂️ فایل‌ها و مدیریت خطا

گرفتن خطا با try و except

۳ گام

برنامه‌ای که با هر ورودی‌ای نمی‌ترکد

در دنیای واقعی کاربرها چیزهای غیرمنتظره وارد می‌کنند. به خطاهایی که وسط اجرا رخ می‌دهند استثنا می‌گویند و پایتون اجازه می‌دهد آن‌ها را بگیریم و خودمان تصمیم بگیریم چه کنیم:

try:
    b = int("salam")
    print(b)
except ValueError:
    print("it's not a numeric string")
  • کدِ ممکن است خطا بدهد داخل try می‌رود.
  • اگر خطا رخ داد، اجرای try همان‌جا قطع می‌شود و پایتون سراغ except می‌رود.
  • اگر خطایی رخ نداد، except کلاً نادیده گرفته می‌شود.

سه قاعدهٔ طلایی:

  • همیشه نوع خطا را مشخص کن: except ValueError: ، نه except: خالی؛ چون except خالی باگ‌های واقعی خودت را هم بی‌صدا پنهان می‌کند.
  • با break می‌شود الگوی «تا درست نگفتی، دوباره بپرس» ساخت؛ درس همین الگو را با while True نشان می‌دهد و با for روی تلاش‌ها هم همین‌قدر کار می‌کند.
  • try/except جای کد درست را نمی‌گیرد؛ برای خطاهای خارج از کنترل تو است (ورودی کاربر، فایل، شبکه). باگ خودت را با آن پنهان نکن.

درس کامل try و except بلوک‌های else و finally را هم توضیح می‌دهد.

  1. ۱گام ۱

    تابعی به اسم safe_divide(a, b) بنویس که a / b را برگرداند، ولی اگر b صفر بود، به‌جای کرش کردن، None برگرداند.

    تقسیم بر صفر خطای ZeroDivisionError می‌دهد. کار را داخل try انجام بده و در except همان نوع خطا را بگیر. (راه‌حلش با if b == 0 هم می‌شود؛ ولی این گام را با try/except حل کن.)

  2. ۲گام ۲

    یادت هست int("salam") خطای ValueError می‌دهد؟ تابعی به اسم to_int(text) بنویس که اگر متن قابل تبدیل بود عدد را برگرداند و اگر نبود، به‌جای خطا، None برگرداند.

    خطای احتمالی این بار ValueError است.

  3. ۳گام ۳

    حالا الگوی معروف «تا درست نگفتی، دوباره تلاش کن» را بساز. لیست تلاش‌های کاربر را داریم:

    attempts = ["abc", "bist", "25"]

    با حلقهٔ for روی attempts بگرد و هر کدام را داخل try به عدد تبدیل کن. اولین تلاش موفق را در متغیر age بریز و همان‌جا با break از حلقه بیرون بیا. اگر تبدیل خطا داد (ValueError)، در except پیام چاپ کن و حلقه به تلاش بعدی می‌رود.

    آخر برنامه مقدار age را چاپ کن. خروجی باید سه خط باشد: دو پیام برای دو تلاش ناموفق و در آخر 25.

در حال آماده‌سازی ویرایشگر…