مدیریت استثناها/خطا (Java Exceptions)
مدیریت استثناها (Exceptions): کدی که نمیشکند 🛡️🏗️
در هنگام اجرای برنامه، ممکن است با خطاهای پیشبینی نشدهای روبرو شوید (مثل تقسیم بر صفر یا نبودنِ یک فایل). بدونِ مدیریتِ صحیح، این خطاها باعث بسته شدنِ ناگهانیِ برنامه میشوند. در جاوا، ما از Exception Handling برای پایداریِ سیستم استفاده میکنیم.
۱. بلوکِ try...catch
کدهایی که احتمالِ خطا دارند را در try میگذاریم و نحوهیِ مواجهه با خطا را در catch تعریف میکنیم:
۲. بلوکِ finally 🔚
کدهای داخلِ finally در هر صورت (چه خطا رخ بدهد و چه ندهد) اجرا میشوند. معمولاً برای بستنِ فایلها یا دیتابیسها از آن استفاده میشود.
۳. کلمه کلیدی throw و throws 🚀
- throw: برای پرتاب کردنِ "دستیِ" یک لرزش/خطا (مثلاً چک کردنِ سنِ کاربر).
- throws: در امضایِ متد استفاده میشود تا به بقیهیِ برنامهنویسان هشدار دهد این متد ممکن است خطا بدهد.
انواعِ خطاها:
- Checked Exceptions: توسطِ کامپایلر چک میشوند (مثل خطایِ خواندنِ فایل). باید حتماً مدیریت شوند.
- Unchecked (RuntimeException): موقعِ اجرا رخ میدهند (مثل خطایِ ریاضی یا NullPointer).
بخش تخصصی: مهندسی پیشرفته و امنیت سیستم 🛡️⚙️
در این بخش، به مفاهیمی میپردازیم که برای پایداری و امنیتِ برنامههای بزرگِ جاوا حیاتی هستند.
۱. استراتژی مدیریت استثناها (Fail-Fast vs Fail-Safe)
در طراحی سیستمهای بزرگ، ما معمولاً از الگوی Fail-Fast استفاده میکنیم؛ یعنی به محض وقوع خطا، برنامه را با یک استثنای دقیق متوقف میکنیم تا از انتشار فساد دادهها جلوگیری کنیم. همچنین، نباید استثناها را با یک بلاکِ catch خالی "خفه" کنید. هر استثنا باید حتماً لاگ (Log) شود یا به لایهی بالاتر گزارش داده شود.
۲. کالبدشکافی Autoboxing در حافظه
تبدیلِ اتوماتیکِ انواعِ Primitive به اشیاءِ Wrapper (مثل تبدیل int به Integer) در ظاهر ساده است، اما در حلقههایِ سنگین میتواند باعثِ ایجادِ هزاران شیءِ اضافه در حافظه Heap و در نتیجه فشار به Garbage Collector شود. همیشه در بخشهای حساس به پرفورمنس، از انواع Primitive استفاده کنید.
۳. پارادایم برنامهنویسی تابعی (Functional Programming)
استفاده از Lambda Expressions شروعِ حرکتِ جاوا به سمت برنامهنویسی تابعی بود. این سبک نه تنها باعثِ کوتاهتر شدنِ کدها میشود، بلکه امکانِ اجرایِ موازیِ کدها (Parallel processing) را روی پردازندههای چند هستهای بسیار سادهتر میکند.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
یک برنامه بنویسید که در بلاکِ try، عدد 10 را بر 0 تقسیم کند. در بلاکِ catch، پیام Error occurred را چاپ کنید.
public class Main {
public static void main(String[] args) {
try {
int x = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Error occurred");
}
}
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.