استثناءات C++ المخصصة

Astthna At C Almkhsst



الاستثناء في C++ هو مفهوم أساسي. يحدث استثناء في وقت التنفيذ عندما يواجه البرنامج حالات عدم تناسق في وقت التشغيل أو سيناريوهات غير عادية. في لغة C++، تُستخدم المصطلحات 'throw' و'try' و'catch' لمعالجة الاستثناء أو التقاطه. يتم استخدام الأمر 'رمي' لإنشاء الاستثناء. يستخدم مصطلح 'try' لطرح الاستثناء، وتمثل الكلمة الأساسية 'catch' معالجة استثناء تم تطويره باستخدام مصطلح 'throw' ويتم طرحه بواسطة قسم 'try'. دعونا نتعمق في بعض الأمثلة لتوضيح الاستثناءات في لغة C++.

المثال 1: برنامج لإنشاء فئة استثناء مخصصة في لغة C++

تم تنفيذ هذا المثال البسيط لتوضيح معالجة الاستثناءات المخصصة واكتشافها في لغة C++.

#تشمل
#تشمل <استثناء>
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;

فصل استثناء تجريبي : عام استثناء
{
افتراضي مقدار ثابت شار * ماذا ( ) مقدار ثابت يرمي ( )
{
يعود 'تم اكتشاف استثناء مخصص' ;
}
} ;
كثافة العمليات رئيسي ( )
{
DemoException dEx ;
يحاول
{
يرمي دي إكس ;
}
يمسك ( استثناء & يستثني )
{
cout << يستثني. ماذا ( ) << endl ;
}
يعود 0 ;
}

نحدد ملف الرأس في الكود بما في ذلك 'iostream' و'الاستثناء'. يتم استدعاء 'iostream' خصيصًا لتدفق الإدخال والإخراج، بينما يتم استدعاء مكتبة 'الاستثناء' للتعامل مع الاستثناء. بعد ذلك، نقوم بإنشاء فئة 'DemoException' المشتقة من فئة 'الاستثناء' في لغة C++. هنا، قمنا بتعيين الدالة ()what الافتراضية التي يتم استخدامها لتوفير const char* الذي يعرض نتائج رسالة خطأ مرتبطة بالاستثناء.







بعد ذلك، نقوم باستدعاء الدالة main() حيث نقوم بإنشاء كائن 'dEx' من فئة 'DemoException'. بعد ذلك، لدينا تعريف كتلة 'محاولة' والذي يطرح الاستثناء في حالة مواجهته. هنا، نرمي الكائن 'dEx'.



بعد ذلك، قمنا بتعيين كتلة 'catch' لالتقاط الاستثناء والتعامل معه. نقوم بتمرير مرجع استثناء الفئة كمعلمة لالتقاط الاستثناء المشتق منه. داخل كتلة 'catch'، نستدعي الدالة What() في 'except' للحصول على رسالة الاستثناء على وحدة التحكم.



بعد تنفيذ البرنامج المحدد، يتم اكتشاف رسالة الاستثناء المخصصة وإلقاءها على وحدة التحكم:





المثال 2: برنامج لإنشاء استثناء مخصص باستخدام فئتين

يركز البرنامج على التعامل مع الاستثناءات المتعددة التي يمكن التعامل معها بشكل مستقل عن طريق تحديد فئات متعددة.



#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;

فصل التقييم1 { } ;
فصل التقييم2 { } ;

كثافة العمليات رئيسي ( ) {
يحاول {
يرمي التقييم1 ( ) ;
}
يمسك ( التقييم1 ه ) {
cout << 'تم اكتشاف استثناء التقييم 1!' << endl ;
}
يحاول {
يرمي التقييم2 ( ) ;
}
يمسك ( التقييم2 ه ) {
cout << 'تم اكتشاف استثناء التقييم 2!' << endl ;
}

يعود 0 ;
}

في الكود المحدد، لدينا تعريف فئتين، 'Evaluation1' و'Evaluation2'، وهما الآن فارغان. بعد ذلك، نقوم بتنفيذ الوظيفة الرئيسية () للبرنامج. هنا، قمنا بتعيين كتلة المحاولة{} حيث يتم استخدام الكلمة الأساسية 'رمي' لرمي مثيل فئة 'Evaluation1()'. ويمثل هذا أنه يتم طرح الاستثناء 'Evaluation1' في حالة ظهور أي استثناء في البرنامج داخل كتلة 'try' هذه. بعد ذلك، لدينا كتلة Catch{} حيث يتم اكتشاف الاستثناء وعرض رسالة الاستثناء.

وبالمثل، لدينا تعريف لكتلة محاولة{} أخرى للفئة 'Evaluation2'. داخل كتلة المحاولة{} تلك، نرمي مثيل فئة 'Evaluation2'. يؤدي هذا إلى استثناء 'Evaluation2' في حالة حدوث خطأ هنا. بعد ذلك، نستدعي كتلة Catch{} لعرض رسالة الاستثناء باستخدام الأمر 'cout' إذا تم اكتشاف الاستثناء داخل هذه الكتلة.

يتم طرح الاستثناءين لكتلة 'محاولة الالتقاط' المختلفة في وحدة التحكم والتي يتم التعامل معها بواسطة الفئتين المختلفتين.

المثال 3: برنامج لإنشاء استثناء مخصص باستخدام المُنشئ

يستخدم البرنامج المنشئ لمعالجة الاستثناء. على الرغم من أننا لا نستطيع الحصول على القيم من المنشئ، إلا أنه يمكننا تحقيق ذلك باستخدام كتلة 'try-catch'.

#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;

فصل امتحان {
كثافة العمليات فال ;

عام :
امتحان ( كثافة العمليات ن )
{
يحاول {
لو ( ن == 0 )
فال = ن ;
عرض ( ) ;
}

يمسك ( مقدار ثابت شار * إكسب ) {
cout << 'تم العثور على استثناء ' ;
cout << إكسب << endl ;
}

}

فارغ عرض ( )
{
cout << 'القيمة =' << فال << endl ;
}
} ;

كثافة العمليات رئيسي ( )
{

امتحان ( 0 ) ;
cout << 'إنشاء مثيل مرة أخرى ' ;
امتحان ( 1 ) ;
}

في الكود المحدد، قمنا بإنشاء فئة 'Test' حيث يتم تعريف المتغير على أنه 'val' من النوع الصحيح. بعد ذلك، لدينا تعريف للدالة المُنشئة 'Test()' والتي يتم تمريرها باستخدام المتغير 'n'. نقوم بعد ذلك بتعيين كتلة 'try-catch' داخل وظيفة المُنشئ 'Test()'. يتم استدعاء كتلة المحاولة باستخدام عبارة if(). إذا كانت قيمة 'n' تساوي الصفر، فستلتقط كتلة 'catch' الاستثناء، وسيتم طرح رسالة الاستثناء في الموجه. يتم تخزين قيمة 'n' في المتغير 'val' أثناء تهيئته.

بعد ذلك، نستدعي الدالة العرض () لإظهار القيمة المخزنة في المتغير “val”. بعد ذلك، لدينا تعريف كتلة 'catch' حيث تتم معالجة الاستثناء الذي تم طرحه بواسطة كتلة 'try'. وأخيرًا، نقوم باستدعاء الدالة main(). داخلها، نسمي مُنشئ 'Test()'. يتم تشغيل المنشئ عندما يتم إنشاء كائن فئة 'Test ()' وتحديده بالقيمة '0' التي تم طرح الاستثناء عليها.

بعد ذلك، نستدعي فئة 'Test()' مرة أخرى لإنشاء مثيل تم تمريره بقيمة 1. هنا، لن يقوم المنشئ بطرح أي استثناء لأن القيمة لا تساوي 0. سوف تقوم وظيفة العرض () تنفيذ وطباعة قيمة 'val'.

يتم طرح الاستثناء المخصص على وحدة التحكم عن طريق استدعاء المنشئ. أيضًا، عند استيفاء الشرط، يتم تنفيذ المنشئ دون أي استثناء.

المثال 4: برنامج لإنشاء استثناء مخصص محدد من قبل المستخدم

يعالج البرنامج هنا ويلتقط الاستثناء الذي يحدده المستخدم عند سؤاله في الموجه.

#تشمل
#تشمل <استثناء>
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل MyDemo : عام استثناء {
عام :
مقدار ثابت شار * ماذا ( ) مقدار ثابت يرمي ( )
{
يعود 'استثناء! حاولت القسمة على صفر.! ' ;
}
} ;
كثافة العمليات رئيسي ( )
{
يحاول
{
كثافة العمليات n1, n2 ;
cout << 'أدخل العددين الصحيحين: ' ;
يتناول الطعام >> ن1 >> n2 ;
لو ( n2 == 0 )
{
            MyDemo n3 ;
يرمي n3 ;
}
آخر
{
cout << 'n1 / n2 = ' << ن1 / n2 << endl ;
}
}
يمسك ( استثناء & باستثناء )
{
cout << باستثناء. ماذا ( ) ;
}
}

في الكود المحدد، قمنا أولاً بتعريف فئة 'MyDemo()' وهي الفئة التابعة للاستثناء. بعد ذلك، قمنا بتعيين وظيفة What() العامة باستخدام الكلمة الأساسية 'الافتراضية'. يتم استدعاء الدالة What() للحصول على سبب الاستثناء في البرنامج عندما تقوم الدالة throw() بطرح الاستثناء. بعد ذلك، لدينا دالة main() حيث يتم تعريف كتل Try-catch{} لاكتشاف الاستثناء ومعالجته. ضمن كتلة Try{}، نعلن عن متغيرين، 'n1' و'n2'، يتم أخذ قيمهما من المستخدم باستخدام الأمر 'cin'. عند استلام القيم مقابل كل متغير 'n1' و'n2'، فإن الشرط 'if' سيتحقق مما إذا كان المتغير 'n2' يساوي 0 أم لا. إذا كان الأمر كذلك، فسيتم طرح استثناء أو إرجاع نتائج القسمة. وأخيرًا، لدينا كتلة Catch{} التي تأخذ مرجع فئة 'الاستثناء' كمعلمة موروثة منها.

يظهر الإخراج عند عدم استيفاء الشرط وتنفيذ البرنامج دون استثناء:

كما قمنا أيضًا بتعريف قيمة '0' للمتغير 'n2' لتمثيل كيفية طرح الاستثناء واكتشافه في البرنامج.

خاتمة

وفي الختام، أوضحنا المفهوم المهم لـ C++ وهو الاستثناء. استثناء يعيق التنفيذ المنتظم للبرنامج. ولهذا استخدمنا الكلمات الرئيسية 'throw' و'try' و'catch' للتعامل مع الاستثناء الذي يحدث في البرنامج. استخدمنا هذه الكلمات الأساسية في الأمثلة السابقة للتعامل مع الاستثناء بشكل مختلف.