ConstructiCat Logo
CodeBust.
Browse section ▾

استبدال الاستثناء باختبار شرطي.

Problem

تقوم برمي استثناء في مكان يمكن لاختبار بسيط فيه القيام بالمهمة؟

Solution

استبدل الاستثناء باختبار شرطي.

##Example

Before
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
After
double getValueForPeriod(int periodNumber) {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

##Why Refactor

يجب استخدام الاستثناءات لمعالجة السلوك غير المنتظم المرتبط بخطأ غير متوقع. ولا ينبغي أن تعمل كبديل للاختبار. إذا كان من الممكن تجنب الاستثناء ببساطة عن طريق التحقق من الشرط قبل التشغيل، فافعل ذلك. يجب حجز الاستثناءات للأخطاء الحقيقية.

على سبيل المثال، دخلت حقل ألغام وقمت بتفجير لغم هناك، مما أدى إلى حدوث استثناء؛ تم التعامل مع الاستثناء بنجاح وتم نقلك جواً إلى بر الأمان خارج حقل الألغام. ولكن كان بإمكانك تجنب كل هذا ببساطة عن طريق قراءة لافتة التحذير الموجودة أمام حقل الألغام في المقام الأول.

##Benefits

  • يمكن أن تكون الجملة الشرطية البسيطة في بعض الأحيان أكثر وضوحًا من كود معالجة الاستثناءات.

##How to Refactor

  1. أنشئ جملة شرطية للحالة الاستثنائية وانقلها قبل كتلة try/catch.

  2. انقل الكود من قسم catch إلى داخل هذه الجملة الشرطية.

  3. في قسم catch، ضع الكود الخاص برمي استثناء عادي غير مسمى وقم بتشغيل جميع الاختبارات.

  4. إذا لم يتم رمي أي استثناءات أثناء الاختبارات، فتخلص من عامل try/catch.