التعامل مع أخطاء الفئات في ++C
القسم الثاني : التعامل مع أخطاء الفئات
يقدم لنا نظام بورلاند ألية مفيدة للغاية في البرمجة الكائنية , فهي تمكننا من التعامل مع الأخطاء التي يمكن أن تحدث أثناء استدعاء دالة منتمية لفئة ما , يطلق علي هذه الألية "الأستثتاء exeptions " وتقوم هذه الألية علي أربعة عناصر :
1- فئة الاستثناء exeption class : وهي فئة تعرف داخل الفئة المراد متابعة حدوث الأخطاء بها .
2- استثارة الاستثناء throwing an exeption : ويقصد بذلك وضع الشرط الذي ينتج عنه استثارة ألية الاستثناء في الدالة التي يخشي وقوع الخطأ عند استدعائها , وتكون الاستثارة باستدعاء بادئة فئة الاستثناء , فتلحق كائنا خاصا بها يتولي التعامل مع الخطأ .
3- كتلة تنفيذ الاستثناء :exeption handler (catch block) مجموعة الأوامر المنفذة عند حدوث الخطأ .
وعلي ذلك يلزم لتطبيق الألية المذكورة استخدام ثلاث كلمات حاكمة :
Throw : لاستثارة الاستثناء
Try : وتسبق كتلة التجربة لتحديد .
Catch : وهي تتلو المجموعة السابقة علي الفور , وتحدد كتلة تنفيذ الاستثناء .
وإليك مثالا تطبيقا . لنرجع إلي المثال stackaray.cpp ونتصور أننا نريد أن ندخل ألية الاستثناء لمتابعة حالتي استثناء ؛ إدخال عدد أكبر من سعة المكدس , أو سحب عدد أكبر مما به . و سوف نجعل المكدس صغيرا (ثلاثة بيانات فقط) حتي يمكننا استثارة الألية بسهولة :
Xstack.cpp
// xstak.cpp// demonstrates exceptions// UCS Laboratories#include <iostream.h>
const int MAX = 3; // stack holds 3 ints
class Stack { private:int st[MAX]; // stack: array of integers
int top; // index of top of stack
public:class Range // exception class for Stack
{ // note: empty class body};
Stack() // constructor { top = -1; }void push(int var)
{if(top >= MAX-1) // if stack full,
throw Range(); // throw exception
st[++top] = var; // put number on stack}
int pop() {if(top < 0) // if stack empty,
throw Range(); // throw exception
return st[top--]; // take number off stack
}
};
void main()//UCS Laboratories {Stack s1;
try {s1.push(11);
s1.push(22);
s1.push(33);
// s1.push(44); // oops: stack full cout << "1: " << s1.pop() << endl; cout << "2: " << s1.pop() << endl; cout << "3: " << s1.pop() << endl;cout << "4: " << s1.pop() << endl; // oops: stack empty
}
catch(Stack::Range) // exception handler
{ cout << "Stack Full or Empty" << endl;}
cout << "Arrive here after catch (or normal exit)" << endl;}
ولنتابع العناصر الأربعة لألية متابعة الأخطاء :
1- فئة الاستثناء ادخلت الفئة Range في فئة المكدس , وتلاحظ أنها فئة فارغة ليس بها بيانات أو دوال منتمية , فكل ما نحتاجه منها هو البادئة التي تنتج كائنا يقوم بربط استثارة الخطأ بكتلة تنفيذ إجرائه . (ليست كل فئات الاستثارة فارغة , أنظر لاحقا – الاستثناء ذو المعاملات ) .
2- استثارة الاستثناء : تلاحظ أن الأمر :
Throw Range();
والذي يعني استثارة بادئة الفئة Range قد ورد في دالتين منتميتين , هما الدالة push() والدالة pop() وفي كل وضع الأمر بعد شرط استثارة الحالة الاستثنائية .
3- كتلة التجربة : وضعت مجموعة الأوامر المطلوب متابعة الحالة الاستثنائية بها بعد الكلمة الحاكمة try , ويمكن أن يكون بالبرنامج أوامر تخرج عن هذا النطاق (لا علاقة لها بالخطأ ) , كما يمكن أن يوجد أكثر من كتلة للتجربة .
4- تنفيذ الاستثناء : يجب أن يتبع كتلة التجربة علي الفور كتلة مميزة بالكلمة الحاكمة catch يضم الأوامر المراد تنفيذها عند حدوث الخطأ . والتنفيذ في مثالنا هو إظهار رسالة بحدوث الخطأ .
بعد تنفيذ هذه الأوامر إما أن يستمر البرنامج بعد كتلة التنفيذ مباشرة , وإما ينتهي البرنامج وهي الحالة الأعم .
تعليقات
إرسال تعليق