ConstructiCat Logo
CodeBust.
Browse section ▾

استبدال رمز الخطأ باستثناء.

Problem

دالة تعيد قيمة خاصة تشير إلى وجود خطأ؟

Solution

قم برمي استثناء (exception) بدلاً من ذلك.

##Example

Before
int withdraw(int amount) {
  if (amount > _balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}
After
void withdraw(int amount) throws BalanceException {
  if (amount > _balance) {
    throw new BalanceException();
  }
  balance -= amount;
}

##Why Refactor

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

##Benefits

  • يخلص الكود من عدد كبير من الجمل الشرطية للتحقق من رموز الأخطاء المختلفة. معالجات الاستثناءات (Exception handlers) هي طريقة أكثر إيجازًا للتمييز بين مسارات التنفيذ العادية وغير العادية.

  • يمكن لفئات الاستثناءات تنفيذ دوالها الخاصة، وبالتالي تحتوي على جزء من وظائف معالجة الأخطاء (مثل إرسال رسائل الخطأ).

  • على عكس الاستثناءات، لا يمكن استخدام رموز الأخطاء في الباني (constructor)، لأن الباني يجب أن يعيد فقط كائنًا جديدًا.

##How to Refactor

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

  1. ابحث عن جميع الاستدعاءات لدالة تعيد رموز أخطاء، وبدلاً من التحقق من رمز الخطأ، قم بتغليفها بكتل try/catch.

  2. داخل الدالة، بدلاً من إرجاع رمز الخطأ، ارمِ استثناءً.

  3. قم بتغيير توقيع الدالة بحيث يحتوي على معلومات حول الاستثناء الذي يتم رميه (قسم @throws).