طرق اكتشاف الخطأ المنطقي
وتنقسم هذه الطرق إلى مجموعتين
- التحكم في سير البرنامج لمعرفة السطر الذي به الخطأ
- اظهار معلومات عن متغيرات أو تعبيرات في نوافذ خاصة
ونحن في هذا الفصل نتناول النوع الثاني من الأخطاء وهو الخطأ الذي يحدث أثناء التنفيذ ويسمى Run Time Error وهو ما يطلق عليه الاستثناءات، فلماذا يطلق عليه ذلك وكيف يمكن معالجته تابع معنا الفقرات التالية
ما هو الاستثناء ولما الاهتمام به
أن كلمة استثناء Exception هي أشارة للعبارة Exceptional أي وقوع حدث استثنائي.
والاستثناء في البرمجة هو وقوع حدث اثناء تنفيذ البرنامج مما يؤدي إلى تعطيل التسلسل الطبيعي لتعليمات instructions البرنامج.
إذا نستطيع القول بأن الاستثناء هو حدوث خطأ ما وهذا الخطأ ليس خطأ في الكود Syntax Error ولكنه قد يكون له العديد من المصادر مثل وجود عيب في المكونات المادية للجهاز مثل أن تحاول الكتابة على قطاع تالف bad sector في القرص الصلب أو ممكن أن يكون في البرامج مثل أن تحاول أن تعدل في سجل ما في قاعدة بيانات وليس لك الحق في ذلك وهكذا…
وعند حدوث مثل هذه الاخطاء خلال تنفيذك لاحد الدوال Methods في الجافا Java تقوم الدالة بانشاء هدف Object من نوع الاستثناء Exception Object ويتم تمرير هذا الهدف إلى نظام وقت التنفيذ Runtime System.
وهذا الهدف Execption Object يحتوي على المعلومات الخاصة بالاستثناء (الخطأ) Exception وهذه المعلومات تشتمل على نوع الاستثناء وحالة البرنامج عند حدوث هذا الخطأ.
عندئذ يكون نظام وقت التنفيذ Runtime System مسئول عن إيجاد جزء الكود المسئول عن معالجة هذا الاستثناء (الخطأ).
وفي لغة ال جافا Java تسمى عملية “انشاء هدف الاستثناء Exception Object وتمريرة إلى نظام وقت التنفيذ Runtime System” تسمى بإرسال ال استثناء Throwing an Exception.
وبعد أن تقوم دالة method بإرسال استثناء throw Exception ينطلق نظام وقت التنتفيذ Runtime System للبحث عن من يقوم بمعالجة الاستثناء والذي يقوم بمعالجة الاستثناء هي مجموعة من الدوال وهذه الدوال موجودة داخل الدالة التي حدث بها الاستثناء. وهذه الدوال عند تنفيذ البرنامج يتم شحنها إلى منطقة معينة في الذاكرة تسمى Call Stack فيقوم نظام وقت التنفيذ Runtime System بالبحث تراجعياً Backwards في Call Stack بادئا بالدالة التي حدث فيها الاستثناء حتى يجد الدالة التي بها معالج الاستثناء Exception Handler المناسب.
إذا فكيف يعرف نظام وقت التنفيذ أن هذا المعالج Exception Handler هو المناسب؟
يعتبر معالج استثناء Exception Handler مناسب لو كان نوع الاستثناء الملقي Exception thrown هو من نفس نوع معالج الاستثناء Exception handler.
لذلك لو تخيلنا أن الاستثناء عبارة عن كره تلقى من أسفل إلى أعلى في Call stack الذي هو مجموعة من الدوال تحتوي على معالجات Handlers ستجد تلك الكره تصعد وتستمر في الصعود حتى تجد الدالة التي بها المعالج المناسب فيقوم بإمساك الاستثناء ومعالجته.
ونسمى معالج الاستثناء Exception Handler المختار نسميه “ملتقط الاستثناء” Catch The Exception.
ولكن قد يبدو هنا وهو ماذا يحدث لو أن نظام وقت التنفيذ قام بالبحث في جميع الدوال الموجودة في Call stack ولم يجد معالج الاستثناء Exception Handler المناسب؟
الإجابة في هذه الحالة يقوم نظام وقت التنفيذ بإنهاء البرنامج ويتم إزالته من الذاكرة.
وقد يتبادر سؤال هنا ما هي المزايا التي يحصل عليها البرنامج باستخدام الاستثناءات والإجابة أننا نحصل على ثلاثة مزايا وسنشرح كل منها بالترتيب:
- فصل كود معالجة الأخطاء عن باقي الكود.
- نشر الأخطاء ونقلها إلى Call stack
- تجميع وتصنيف كل خطأ بحيث يكون كل خطأ يتنمي إلى مجموعة عامة.
فصل كود معالجة الأخطاء عن باقي الكود