Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

C++الإستثناءات الجاهزة و كيفية تعريف إستثناء جديد

  • الإستثناءات الإفتراضية
  • مثال حول كيفية تعريف إستثناء جديد

الإستثناءات الإفتراضية

قبل شرح كيفية تعريف إستثناء جديد, يجب أن تعرف كيف تم بناء الإستثناءات الجاهزة في اللغة.
بشكل عام std::exception هو الكلاس الأساسي لأي إستثناء يتم تعريفه لذلك يجب على أي كلاس يمثل إستثناء أن يرث منه.
بعد أن يرث منه, يجب أن يفعل Override لدالة إسمها what() ليحدد فيها قيمة الإستثناء الذي سيتم رميه.

الصورة التالية تظهر لك الإستثناءات الجاهزة في C++ و كيف أنها ترث من الكلاس std::exception.


مثال حول كيفية تعريف إستثناء جديد

في المثال التالي قمنا بتعريف كلاس إسمه MyException و جعلناه يرث من الكلاس exception لكي يمثل إستثناء.
في هذا الكلاس قمنا بإعادة تعريف الدالة what() لجعلها تقوم برمي إستثناء عبارة عن نص (سلسلة أحرف) عندما يتم استدعاءها.

مثال

main.cpp
#include <iostream>
#include <exception>
using namespace std;
// لأننا نريده أن يمثل إستثناء exception يرث من الكلاس MyException هنا قمنا بتعريف كلاس إسمه
class MyException : public exception
{
public:
// لجعلها ترمي الإستثناء الذي نريده عندما نقوم باستدعائها what() هنا قمنا بتعريف الدالة
const char* what() const throw ()
{
return "My Exception is thrown! \n";
}
};
// main() هنا قمنا بتعريف الدالة
int main()
{
// الموجودة فيه what() حتى نتمكن من استدعاء الدالة myExcep إسمه MyException هنا قمنا بإنشاء كائن من الكلاس
MyException myExcep;
// الموجودة فيه بشكل تلقائي what() و الذي بدوره سيقوم باستدعاء الدالة myExcep هنا قمنا برمي إستثناء نوعه
try
{
throw myExcep;
}
// الموجودة فيه what() سيتم إستدعاء الدالة MyException هنا قلنا أنه في حال كان الإستثناء الذي تم رميه نوعه
catch(MyException& e)
{
cout << e.what();
}
// و هنا نقصد من أي نوع كان exception هنا قلنا أنه في حال كان الإستثناء الذي تم رميه نوعه
catch(exception& e)
{
// هنا يمكنك كتابة ماذا نريد أن نفعل في حال حدوث أي إستثناء آخر
}
cout << "The program is still working properly :)";
}
#include <iostream> #include <exception> using namespace std; // لأننا نريده أن يمثل إستثناء exception يرث من الكلاس MyException هنا قمنا بتعريف كلاس إسمه class MyException : public exception { public: // لجعلها ترمي الإستثناء الذي نريده عندما نقوم باستدعائها what() هنا قمنا بتعريف الدالة const char* what() const throw () { return "My Exception is thrown! \n"; } }; // main() هنا قمنا بتعريف الدالة int main() { // الموجودة فيه what() حتى نتمكن من استدعاء الدالة myExcep إسمه MyException هنا قمنا بإنشاء كائن من الكلاس MyException myExcep; // الموجودة فيه بشكل تلقائي what() و الذي بدوره سيقوم باستدعاء الدالة myExcep هنا قمنا برمي إستثناء نوعه try { throw myExcep; } // الموجودة فيه what() سيتم إستدعاء الدالة MyException هنا قلنا أنه في حال كان الإستثناء الذي تم رميه نوعه catch(MyException& e) { cout << e.what(); } // و هنا نقصد من أي نوع كان exception هنا قلنا أنه في حال كان الإستثناء الذي تم رميه نوعه catch(exception& e) { // هنا يمكنك كتابة ماذا نريد أن نفعل في حال حدوث أي إستثناء آخر } cout << "The program is still working properly :)"; }

سنحصل على النتيجة التالية عند التشغيل.

My Exception is thrown!
The program is still working properly :)