التعامل مع أخطاء الفئات في ++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 يضم الأوامر المراد تنفيذها عند حدوث الخطأ . والتنفيذ في مثالنا هو إظهار رسالة بحدوث الخطأ .
بعد تنفيذ هذه الأوامر إما أن يستمر البرنامج بعد كتلة التنفيذ مباشرة , وإما ينتهي البرنامج وهي الحالة الأعم .
تعليقات
إرسال تعليق