Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

Java Exception(Anti-Pattern)

📖توضیحات درس

🎥 آموزش جاوا – قسمت شصت‌ و پنجم از بوت‌کمپ رایگان جاوا ⚠️ آنتی‌پترن‌ها در Exception Handling جاوا در این قسمت سراغ یکی از موضوعات مهم و حیاتی در جاوا رفتیم: آنتی‌پترن‌ها در مدیریت استثناها (Exception Handling). گاهی وقت‌ها ما سعی می‌کنیم اکسپشن‌ها رو به روش‌های مختلف مدیریت کنیم، اما بعضی از این روش‌ها به‌جای کمک، باعث پیچیدگی، خطاهای پنهان و کاهش خوانایی کد می‌شن! توی این جلسه یاد می‌گیریم کدهایی که نباید بنویسیم! 😅 یعنی آنتی‌پترن‌هایی که باعث می‌شن پروژه‌هامون از کنترل خارج بشه، نگهداریش سخت بشه و دیباگ کردنش دردسر بشه. 💡 در طول ویدیو با مثال‌های واقعی، خطاهای رایج رو بررسی می‌کنیم و یاد می‌گیریم چطور ازشون اجتناب کنیم تا Exception Handling تمیز و اصولی داشته باشیم. 📘 در این جلسه با هم بررسی می‌کنیم: 🚫 Use General Exception → چرا استفاده از Exception عمومی اشتباهه و چطور باید اکسپشن‌های خاص‌تر تعریف کنیم. 🙈 Swallowing Exceptions → نادیده گرفتن خطاها بدون ثبت یا گزارش، یکی از بدترین آنتی‌پترن‌هاست! 🔁 Using return در finally block → چرا این کار می‌تونه رفتار متد رو غیرقابل پیش‌بینی کنه. 💥 Using throw در finally block → چه زمانی پرتاب اکسپشن در finally باعث از بین رفتن اطلاعات خطای اصلی می‌شه. 🚷 Using throw as a goto → استفاده‌ی اشتباه از throw برای کنترل جریان برنامه و پیامدهای اون. 🧭 Review & Best Practices → در انتهای ویدیو، مرور کامل و جمع‌بندی اصول درست مدیریت اکسپشن‌ها. 💬 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشتی، داخل گروه بپرس تا من یا مربی‌های گروه راهنماییت کنیم 💬 🎯 بوت‌کمپ رایگان جاوا – آموزش پروژه‌محور برای یادگیری عمیق و ورود به بازار کار.
00:20:20🎯رایگان

📄جزوه

مفاهیم کلیدی

  • 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 استفاده کنید. اکسپشن‌ها باید فقط برای وقایع استثنایی و خطاهای واقعی سیستم استفاده شوند.