برنامه سازی پیشرفته
درس متنی
جلسه 13مدیریت خطا و استثنا
خلاصه نکات کلیدی :
هدف اصلی: جلوگیری از کرش کردن ناگهانی برنامه و ارائه بازخورد مناسب به کاربر یا ثبت خطا برای رفع اشکال.
تمایز: بین خطاهای نحوی (که کامپایلر میگیرد) و خطاهای زمان اجرا (که برنامه در حال اجرا با آنها مواجه میشود) تفاوت قائل شوید. استثناءها بخشی از خطاهای زمان اجرا هستند.
try و catch/except: این دو بلوک، هسته اصلی مدیریت استثناء هستند. try کدی را که ممکن است مشکلی ایجاد کند در بر میگیرد و catch/except واکنشی است به مشکلی که رخ داده است.
finally: همیشه اجرا میشود. این بلوک برای کارهایی مانند بستن فایل یا آزادسازی حافظه بسیار حیاتی است، زیرا تضمین میکند که این اقدامات حتی اگر خطایی رخ دهد، انجام شوند.
استثناءهای سفارشی: وقتی خطاهای پیشفرض زبان کافی نیستند، میتوانید خطاهای خودتان را تعریف کنید تا وضعیتهای خاص برنامه را بهتر نشان دهید.
پیامهای خطا: پیامهای خطا نباید فقط برای برنامهنویسان قابل فهم باشند، بلکه باید به کاربر نهایی نیز در درک مشکل کمک کنند.
کنترل جریان: از استثناءها برای کنترل عادی جریان برنامه استفاده نکنید. به عنوان مثال، اگر انتظار دارید یک ورودی عددی باشد، نباید از استثناء برای مدیریت حالتی که کاربر متن وارد میکند استفاده کنید، بلکه باید ورودی را اعتبارسنجی کنید.
- مقدمه و اهمیت مدیریت خطا:
- تعریف خطا (Error) و استثناء (Exception).
- چرا مدیریت خطا مهم است؟ (پایداری نرمافزار، تجربه کاربری بهتر، اشکالزدایی آسانتر).
- تفاوت بین خطا و استثناء در زبانهای برنامهنویسی مختلف.
- انواع خطاها:
- خطاهای زمان کامپایل (Compile-time Errors): خطاهای نحوی (Syntax Errors)، خطاهای معنایی (Semantic Errors).
- خطاهای زمان اجرا (Run-time Errors):
- خطاهای منطقی (Logic Errors): برنامه اجرا میشود اما خروجی نادرست است.
- خطاهای پیشبینی نشده (Unexpected Errors): مانند تقسیم بر صفر، دسترسی به حافظه نامعتبر، خطای I/O.
- مفهوم استثناء (Exception):
- استثناء به عنوان یک رویداد غیرمنتظره در زمان اجرا که اجرای عادی برنامه را مختل میکند.
- تفاوت استثناء با خطاهای معمول.
- چرخه حیات مدیریت استثناء (Exception Handling Lifecycle):
- ایجاد (Throwing/Raising): زمان وقوع یک استثناء.
- انتشار (Propagation): استثناء از یک تابع به تابع فراخواننده (caller) منتقل میشود.
- دریافت و مدیریت (Catching/Handling): بلاکی از کد که استثناء را دریافت و پردازش میکند.
- تکنیکهای مدیریت استثناء:
- بلوک
try-catch(یاtry-except): - مفهوم
try: کدی که ممکن است باعث بروز استثناء شود. - مفهوم
catch/except: کدی که استثناء را مدیریت میکند. - مدیریت انواع مختلف استثناءها.
- دستهبندی استثناءها (مثلاً خطاهای ورودی/خروجی، خطاهای محاسباتی، خطاهای شبکه).
- بلوک
finally: - اجرای کد بدون توجه به رخ دادن یا عدم رخ دادن استثناء (مناسب برای آزادسازی منابع).
- ایجاد استثناءهای سفارشی (Custom Exceptions):
- زمان و دلیل ایجاد استثناءهای سفارشی.
- نحوه تعریف و استفاده از آنها.
- بهترین شیوهها (Best Practices):
- مدیریت استثناءها در سطوح مناسب.
- نوشتن پیامهای خطای گویا و مفید.
- پرهیز از نادیده گرفتن استثناءها (Empty Catch Blocks).
- آزادسازی منابع (مانند فایلها، اتصالات شبکه) در بلوک
finallyیا با استفاده از روشهای مدیریت منابع خودکار (مانندusingدر C# یاtry-with-resourcesدر Java). - استفاده از استثناءها برای شرایط استثنایی، نه برای کنترل جریان برنامه.
خلاصه نکات کلیدی :
- هدف اصلی: جلوگیری از کرش کردن ناگهانی برنامه و ارائه بازخورد مناسب به کاربر یا ثبت خطا برای رفع اشکال.
- تمایز: بین خطاهای نحوی (که کامپایلر میگیرد) و خطاهای زمان اجرا (که برنامه در حال اجرا با آنها مواجه میشود) تفاوت قائل شوید. استثناءها بخشی از خطاهای زمان اجرا هستند.
tryوcatch/except: این دو بلوک، هسته اصلی مدیریت استثناء هستند.tryکدی را که ممکن است مشکلی ایجاد کند در بر میگیرد وcatch/exceptواکنشی است به مشکلی که رخ داده است.finally: همیشه اجرا میشود. این بلوک برای کارهایی مانند بستن فایل یا آزادسازی حافظه بسیار حیاتی است، زیرا تضمین میکند که این اقدامات حتی اگر خطایی رخ دهد، انجام شوند.- استثناءهای سفارشی: وقتی خطاهای پیشفرض زبان کافی نیستند، میتوانید خطاهای خودتان را تعریف کنید تا وضعیتهای خاص برنامه را بهتر نشان دهید.
- پیامهای خطا: پیامهای خطا نباید فقط برای برنامهنویسان قابل فهم باشند، بلکه باید به کاربر نهایی نیز در درک مشکل کمک کنند.
- کنترل جریان: از استثناءها برای کنترل عادی جریان برنامه استفاده نکنید. به عنوان مثال، اگر انتظار دارید یک ورودی عددی باشد، نباید از استثناء برای مدیریت حالتی که کاربر متن وارد میکند استفاده کنید، بلکه باید ورودی را اعتبارسنجی کنید.
تمرین پایان فصل:
- پیادهسازی
try-catch: برنامهای بنویسید که از کاربر یک عدد دریافت کند و سپس آن را بر عدد دیگری (مثلاً 0) تقسیم کند. این تقسیم باید درون یک بلوکtryقرار گیرد و خطای تقسیم بر صفر باید در بلوکcatch/exceptمدیریت شود. در صورت بروز خطا، یک پیام مناسب به کاربر نمایش داده شود. - استفاده از
finally: در تمرین قبل، یک بلوکfinallyاضافه کنید که پیامی مانند “عملیات تقسیم به پایان رسید.” را نمایش دهد، صرف نظر از اینکه خطا رخ داده باشد یا خیر. - ایجاد استثناء سفارشی: تابعی بنویسید که سن کاربر را دریافت کند. اگر سن کمتر از 0 یا بیشتر از 120 بود، یک استثناء سفارشی (مثلاً
InvalidAgeError) ایجاد کند. این تابع باید درون یک بلوکtry-catchفراخوانی شود تا این استثناء سفارشی را دریافت و مدیریت کند.
دروس متنی
#1
جلسه 1 آشنایی با زبان جاوا
#2
جلسه 2ویژگی هاي زبان جاوا ◦
#3
جلسه 3 اولین برنامه در جاوا ◦
#4
جلسه 4 مفاهیم اولیه برنامه سازي در جاوا
#5
جلسه 5 مقدمه اي بر طراحی و برنامه سازي شیءگرا
#6
جلسه 6 برنامه سازي شیءگرا در جاوا
#7
جلسه 7وراثت
#8
جلسه 8چندریختی
#9
جلسه 9(interface) واسط
#10
جلسه 10آزمون نرم افزار
#11
جلسه 11الگوهاي طراحی
#12
جلسه 12 (Refactoring) بازآرایی کد
#13
جلسه 13مدیریت خطا و استثنا
#14
جلسه 14 (Generics) داده هاي عام
#15
جلسه 15 (Containers) مجموعه ها و ظرف ها
#16
جلسه 16فایل، جویبار و شبکه
#17
جلسه 17برنامه سازي همروند
#18
جلسه 18 Reflection
#19
جلسه 19مفاهیم پیشرفته و تکمیلی
مشاهده دروس کامل
بررسی صفحه یادگیری دوره