جلوگیری از سقوط برنامه
### داستان بیست و دوم: جلوگیری از سقوط برنامه
آراد که به تازگی با مفهوم مدیریت خطاها آشنا شده بود، تصمیم گرفت که برنامهای بنویسد که در آن، چند محاسبه و پردازش مختلف انجام شود. او میخواست برنامهاش طوری باشد که حتی اگر خطایی رخ داد، بتواند به درستی از برنامه خارج شود و کارهای ضروری را انجام دهد. آراد که نیاز به راهنمایی داشت، به سراغ سینا رفت و گفت: «سینا، میخوام برنامهام حتی وقتی خطا رخ میده، به خوبی ادامه بده و در نهایت کارهای لازم رو انجام بده. `finally` دقیقاً چطوری کمک میکنه؟»
#### آشنایی با `finally` و `else`
سینا برای آراد توضیح داد که در مدیریت خطاها، علاوه بر `try` و `except`، میتوان از دو بلوک `else` و `finally` استفاده کرد تا برنامه حرفهایتر و کاملتر باشد. او گفت: «`else` زمانی اجرا میشود که هیچ خطایی رخ نداده باشد و `finally` همواره اجرا میشود، چه خطا رخ دهد و چه رخ ندهد. از `finally` میتوان برای انجام کارهایی که در هر شرایطی باید انجام شوند، مثل بستن فایلها یا پاکسازی منابع، استفاده کرد.»
#### مثال اول: استفاده از `else`
سینا کدی برای آراد نوشت تا مفهوم `else` را بهتر درک کند:
“`python
try:
عدد۱ = int(input(“عدد اول را وارد کنید: “))
عدد۲ = int(input(“عدد دوم را وارد کنید: “))
نتیجه = عدد۱ / عدد۲
except ZeroDivisionError:
print(“خطا: نمیتوان عددی را بر صفر تقسیم کرد.”)
except ValueError:
print(“خطا: لطفاً فقط اعداد صحیح وارد کنید.”)
else:
print(“نتیجه تقسیم:”, نتیجه)
“`
سینا توضیح داد که بخش `else` فقط در صورتی اجرا میشود که هیچ خطایی رخ ندهد. در این مثال، اگر همه چیز درست باشد و خطایی وجود نداشته باشد، نتیجهی تقسیم چاپ میشود. در غیر این صورت، برنامه وارد بلوک `except` میشود و `else` نادیده گرفته میشود.
#### مثال دوم: استفاده از `finally`
سینا مثالی دیگر با استفاده از `finally` برای آراد نوشت و به او گفت که این بخش از کد حتی در صورت وقوع خطا هم اجرا میشود. او مثال زیر را برای آراد توضیح داد:
“`python
try:
فایل = open(“دادهها.txt”, “r”)
محتوا = فایل.read()
except FileNotFoundError:
print(“خطا: فایل مورد نظر یافت نشد.”)
else:
print(“محتوای فایل:”, محتوا)
finally:
print(“برنامه در حال بستن فایل است.”)
فایل.close()
“`
سینا گفت: «در اینجا، حتی اگر خطای `FileNotFoundError` رخ دهد و فایل وجود نداشته باشد، `finally` اجرا میشود و دستور `فایل.close()` بدون توجه به وجود خطا، فایل را میبندد. این کار مانع از بروز خطاهای دیگر مثل باقی ماندن فایلهای باز میشود.»
#### کاربردهای `finally`
آراد پرسید: «این `finally` چه موقعهایی کاربردی است؟»
سینا جواب داد: «فرض کن که برنامهات فایلها یا منابع دیگری مثل اتصالهای شبکه را باز میکند. در این صورت، حتی اگر در طول اجرای برنامه خطایی رخ دهد، با استفاده از `finally` میتوانیم اطمینان پیدا کنیم که در هر حال، این منابع به درستی بسته یا پاکسازی میشوند.»
#### تمرین: مدیریت منابع در یک برنامه محاسباتی
سینا از آراد خواست تا برنامهای بنویسد که در آن از `finally` برای پاکسازی منابع استفاده کند. آراد با استفاده از یادگیری خود، برنامهای برای تقسیم اعداد نوشت که در آن حتی اگر کاربر اشتباهاتی مثل وارد کردن داده نامعتبر یا صفر را انجام دهد، در نهایت پیغام مشخصی نمایش داده شود.
“`python
try:
print(“ورود اطلاعات برای محاسبه تقسیم.”)
عدد۱ = int(input(“عدد اول را وارد کنید: “))
عدد۲ = int(input(“عدد دوم را وارد کنید: “))
نتیجه = عدد۱ / عدد۲
except ZeroDivisionError:
print(“خطا: نمیتوان عددی را بر صفر تقسیم کرد.”)
except ValueError:
print(“خطا: لطفاً فقط اعداد صحیح وارد کنید.”)
else:
print(“نتیجه تقسیم:”, نتیجه)
finally:
print(“محاسبه به پایان رسید. ممنون از استفاده شما!”)
“`
با اجرای این برنامه، حتی اگر خطایی رخ دهد، برنامه با پیام «محاسبه به پایان رسید. ممنون از استفاده شما!» پایان مییابد و این باعث میشود کاربر از اجرای کامل برنامه مطمئن شود.
#### نتیجهگیری
آراد با خوشحالی گفت: «حالا میفهمم که چطور میتونم برنامهام رو حتی در صورت وقوع خطا پایدار نگه دارم و از منابع استفاده بهینه کنم. استفاده از `finally` خیلی به نظرم کاربردیه.»
سینا خندید و گفت: «دقیقاً، آراد! `finally` مثل نجاتدهنده برنامهات عمل میکنه و کمک میکنه که از سقوط یا باقیماندن منابع باز جلوگیری کنی. با این کار، برنامهای مقاوم و حرفهایتر خواهی داشت!»