گاهی دادهٔ نامعتبر طبیعی هست: کاربر به جای عدد واژه مینویسه یا مخرج صفر میشه. این موارد قابل مدیریتاند. گرفتن همهٔ خطاها با except: میتونه اشتباه برنامهنویسی رو پنهان کند. فقط خطایی رو بگیر که انتظار داری و میدانی چطور به اون پاسخ بدهی.
def divide_text(a, b):
try:
numerator = int(a)
denominator = int(b)
answer = numerator / denominator
except ValueError:
return "عدد صحیح لازم است"
except ZeroDivisionError:
return "مخرج صفر است"
else:
return answer
def require_grade(grade):
if grade < 0 or grade > 20:
raise ValueError("نمره باید بین صفر و بیست باشد")
return grade
print(divide_text("8", "2"))
print(divide_text("x", "2"))
print(divide_text("8", "0"))
print(require_grade(20))
تبدیل متن نامعتبر ValueError و تقسیم بر صفر ZeroDivisionError میده. else فقط وقتی اجرا میشه که try بدون خطا تمام شده باشه.
finally چه موفق شویم و چه خطا رخ دهد، هنگام خروج از ساختار اجرا میشه؛ معمولاً برای کار نهایی و کارهایی مثل بستن فایل بازشده هست. return داخل finally ممکن هست پاسخ یا خطای قبلی رو بپوشاند؛ این کار رو نکن. در تمرین بعد ترتیب این مسیرها رو مشاهده میکنیم.
با raise میتونیم قانون خودمان رو اعلام کنیم. require_grade برای عدد خارج بازه ValueError میسازه و برای مقدار معتبر همون عدد رو برمیگردونه. تصمیم نهایی دربارهٔ پاسخ به خطا بر عهدهٔ بخشی که تابع رو صدا زده هست. خطای برنامهنویسی رو با صفر جعلی پنهان نکن.
فعالیت شما
خطاهای دقیق و مسیرهای try/except/else/finally رو بشناس.