الكثير من المبرمجين لا يعير الاستثناءات أي اعتبار وهذا ما يجعل البرنامج غير سليم وهو ما يودي ألي توقف البرنامج عادة.
الاستثنائات هي عبارة عن أخطاء غالبا غير مقصودة تحدث عند التعامل مع احدي مكونات الكمبيوتر برمجيا وذلك
بفشل هذا المكون في تنفيذ الأمر المطلوب منه.
متى تحدث الاستثناءات؟
تحدث الاستثنائات عندما يطلب البرنامج التعامل مع احدي أجهزة الداخلية للكمبيوتر مثل الذاكرة ،المعالج، الفيديو، القرص،الخ
ويعتبر القسمة علي صفر هي من أشهر الاستثناءات وذلك لان المعالج لا يستطيع تنفيذ هذا الأمر، كذلك عند فشل محرك الأقراص
في فتح ملف أو الكتابة والقرءاة منه الخ.
كيف يتم التعامل مع الاستثناء؟
تتيح لغة C++ طريقة للتحكم في الاستثناءات بكل يسر فهنالك كلمتين محجوزتين للتعامل مع الاستثناءات وهي
الكلمة try والكلمة catch ،يجب وضع الأوامر التي تتعامل مع احدي المكونات داخل المقطع try.
مثلا:
Try
{
//code
File.open(szFile);
}
Catch(...)
{
Msg(“error cant open file”)
}المثال السابق يوضح الطريق التي يمكن استخدامها لحماية البرنامج من فشل القرص في فتح الملف بوضع الاوامر
التي تتعامل مع الملف داخل عبارة try ووضع الاوامر التي تتعامل مع الاستثناء داخل عبارة catch. عند فشل القرص
يحدث استثناء ويتم القفز ألي داخل عبارة catch لتنفيذ الاوامر التي بداخلها. المثال السابق يعرض رسالة خطاء
للمستخدم فقط ولكن يمكنك إضافة أشياء أخري مثل إغلاق الملف أو تسجيل هذا الاستثناء داخل ملف Log يستخدمه
البرنامج لتحسين البرنامج مستقبلا.
حاول دائما حماية البرنامج من الأوامر التي تتعامل مع مكونات الحاسوب بوضعها داخل عبارات try و catch ،لكن لا تكثر
من استخدام try حاول بقدر الإمكان حماية المناطق التي تشك فيها فالإكثار من استخدام try يجعل البرنامج اكبر حجما.
تعشيش العبارة catch.
يمكن تعشيش عبارة catch عدة مرات مع عبارة try واحدة .
try
{
}
catch(FileNotFound)
{
}
catch(FileOpenError)
{
}
catch(...)
{
}المثال السابق يتعامل مع مجموعة من الاستثنئاءات بتعشيش عدة عبارات catch ، حيث يعتبر FileNotFound استثناء
و FileOpenError استثناء،
طريقة عمل المثال السابق هي أن يتم تنفيذ الأوامر داخل عبارة try وإذا حدث استثناء يتم القفز ألي عبارة catch الأولي
ويتم مقارنة الاستثناء بكائن الاستثناء FileNotFound أذا تطابق يتم تنفيذ الكود داخل عبارة catch هذا وإذا لم يتطابق
يتم مقارنة الاستثناء بالكائن الأخر الذي يله وهكذا. عند وضع ثلاث نقاط بدل كائن الاستثناء فهذا يعني أي نوع من كائن الاستثناءات.
أنشاء هيكل للاستثناءات.
من أفضل الطرق لحماية البرنامج كاملا هي أنشاء هيكل ثابت للاستثناءات ،لقد ذكرنا في المثال السابق كائن الاستثناء، لا تشغل
بالك كثيرا فهو عبارة عن طبقة من إنشائك لا غير، هذه الطبقة قد تكون جزء من عدة طبقات فلكل استثناء طبقة خاصة به .
class exp_base
{
Protected:
char msg[1024];
unsigned int err_n;
}class exp_file: public exp_base
{
exp_file (char* errmsg,int err)
{
msg = errmsg;
err_num = err;
}
}class file
{
public:
int open(char* file_name) throw(exp_file)
{
if( !file_name )
throw file_name (“the file name is empty”, E_NMAE_OF_FILE);
return E_NMAE_OF_FILE;
if(file_name == “”)
throw file_name (“the file name is empty”, E_NMAE_OF_FILE);
return E_NMAE_OF_FILE;
try
{
//open the file
}
catch(...)
{
//catch
}
int err = open(file_name);
if(err != 1) throw(exp_file_not_found);
}
}بعد أنشاء هيكل للاستثناءات يمكنك التعامل بكل سهولة مع الاستثناءات التي تقع و فعل ما هو مناسب حيالها.

