Java Exception(Anti-Pattern)
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
-
Anti-Pattern الگوهای رایجی در برنامهنویسی که در ظاهر راهکار به نظر میرسند، اما در عمل باعث ایجاد مشکل، پیچیدگی و سخت شدن روند دیباگ (Debugging) میشوند.
-
Catching General Exception استفاده از کلاس پایه
Exceptionدر بلاکcatchبه جای استفاده از استثناهای اختصاصی (مانندArithmeticException). این کار باعث ابهام در کد و دشواری در شناسایی نوع دقیق خطا میشود. -
Swallowing Exception اصطلاحاً خفه کردن یا بلعیدن استثنا؛ زمانی رخ میدهد که یک اکسپشن در بلاک
catchگرفته میشود اما هیچ واکنشی (مانند چاپ خطا یا ثبت لاگ) به آن نشان داده نمیشود و برنامه به سادگی از کنار آن عبور میکند. -
Finally Block بلاک کدی که پس از
tryوcatchهمیشه اجرا میشود. استفاده از دستوراتی که روند برنامه را تغییر میدهند (مانندreturn) در این بلاک یک آنتیپترن جدی است. -
Flow Control مدیریت مسیر اجرای برنامه. استفاده از سیستم اکسپشن برای کنترل منطق برنامه (به جای استفاده از ساختارهای شرطی مانند
ifوelse) یک اشتباه تکنیکی محسوب میشود. -
Stack Trace گزارشی که ترتیب فراخوانی متدها را در لحظه بروز خطا نشان میدهد و برای پیدا کردن منشأ اصلی مشکل در کد حیاتی است.
موارد مصاحبه ای
-
چرا استفاده از
Exceptionبه صورت کلی (General) در بلاکcatchبد است؟ این کار باعث میشود کد مبهم شود. برنامهنویس بعدی نمیداند دقیقاً چه خطای مشخصی قرار است مدیریت شود. همچنین ممکن است استثناهای غیرمنتظرهای که باید برنامه را متوقف کنند، به اشتباه مدیریت شده و مخفی بمانند. -
خفه کردن اکسپشن (Swallowing Exception) چه خطراتی دارد؟ باعث میشود رفتار برنامه غیرقابل پیشبینی شود. برای مثال، اگر در صورت بروز خطا، یک مقدار تصادفی یا ثابت (مثل ۱۶۰) برگردانده شود، کاربر یا سیستمهای دیگر تصور میکنند عملیات موفق بوده، در حالی که در واقعیت خطایی رخ داده است.
-
تأثیر استفاده از
returnدر بلاکfinallyچیست؟ استفاده ازreturnدر این بلاک باعث میشود مقدار بازگشتی در بلاکهایtryیاcatchبازنویسی (Override) شود. خطرناکتر اینکه اگر استثنایی پرتاب شده باشد، دستورreturnدرfinallyباعث سرکوب و از بین رفتن آن استثنا میشود و برنامه به حالت عادی ادامه میدهد. -
چرا نباید از
throwبه عنوان جایگزینgotoاستفاده کرد؟ استثناها برای مدیریت شرایط غیرمنتظره و خطاها هستند. استفاده از آنها برای هدایت روند برنامه (Flow Control) باعث پیچیدگی بیهوده و کاهش شدید خوانایی و کارایی کد میشود.
سناریو کاربردی
در یک برنامه تقسیم اعداد، اگر کاربر عدد صفر را وارد کند، ArithmeticException رخ میدهد.
- رویکرد اشتباه ۱: گرفتن کلاس
Exceptionبه صورت کلی. در این حالت اگر خطای دیگری (مثل خطای حافظه) هم رخ دهد، با همین بلاک مدیریت میشود که اشتباه است. - رویکرد اشتباه ۲ (بلعیدن خطا): بلاک
catchرا خالی بگذاریم. برنامه بدون هیچ توضیحی تمام میشود و کاربر نمیفهمد چرا خروجی نگرفته است. - رویکرد اشتباه ۳ (مقدار غلط): در صورت خطا، عدد ثابتی مثل
0برگردانیم. این کار باعث میشود محاسبات بعدی بر پایه یک داده غلط و پنهان انجام شود. - رویکرد اشتباه ۴ (استفاده در Finally): اگر در بلاک
finallyمقدار ۱۰۰ راreturnکنیم، حتی اگر تقسیم درست انجام شود و نتیجه ۵ باشد، متد همیشه مقدار ۱۰۰ را برمیگرداند.
بیشتر بدانید
-
IDE Tip در محیط IntelliJ IDEA، اگر از دستور
returnداخل بلاکfinallyاستفاده کنید، خودِ IDE به شما هشدار (Warning) میدهد که این کار باعث میشود متد به صورت نرمال به پایان نرسد (finally block cannot complete normally). -
فلسفه کدنویسی (Clean Code) همیشه طوری کد بزنید که انگار نفر بعدی که قرار است کد شما را نگهداری کند، یک قاتل زنجیرهای خطرناک است که آدرس خانه شما را میداند! این دیدگاه به شما کمک میکند تا کدی بنویسید که حداکثر خوانایی و شفافیت را داشته باشد.
-
توصیه فنی به جای کنترل فلو با اکسپشن، از شرطهای ساده
ifاستفاده کنید. اکسپشنها باید فقط برای وقایع استثنایی و خطاهای واقعی سیستم استفاده شوند.
