التعامل مع أخطاء الفئات في ++C

القسم الثاني : التعامل مع أخطاء الفئات

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



بعد تنفيذ هذه الأوامر إما أن يستمر البرنامج بعد كتلة التنفيذ مباشرة , وإما ينتهي البرنامج وهي الحالة الأعم .



 

التسميات: