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

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

المشكلة

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

الحل

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

##مثال

قبل
int withdraw(int amount) {
  if (amount > balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}
بعد
void withdraw(int amount) throws BalanceException {
  if (amount > balance) {
    throw new BalanceException();
  }
  balance -= amount;
}

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

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

##الفوائد

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

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

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

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

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

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

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

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