شعار ConstructiCat
CodeBust.
تصفح القسم ▾

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

المشكلة

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

الحل

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

##مثال

قبل
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
بعد
double getValueForPeriod(int periodNumber) {
  if (periodNumber < 0 || periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

##لماذا نعيد الهيكلة

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

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

##الفوائد

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

##كيفية إعادة الهيكلة

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

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

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

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