সি++-এ, এক্সেপশন হ্যান্ডেলিং (Exception Handling) হল একটি প্রসেস যা রানটাইম এরর (runtime errors) হ্যান্ডেল করে। এক্সেপশন (Exception) হল একটি ইভেন্ট যা সি++-এ রানটাইমে থ্রো (thrown) হয়। সব এক্সেপশন std::exception ক্লাস থেকে ডেরাইভড (derived)। এটি একটি রানটাইম এরর যা হ্যান্ডেল করা যায়। এটি এক্সেপশন মেসেজ প্রিন্ট করে এবং প্রোগ্রাম টার্মিনেট করে, যদি আমরা এক্সেপশন হ্যান্ডেল না করি।
এক্সেপশনগুলো সি++ স্ট্যান্ডার্ডে <exception> ক্লাস হিসেবে ডিফাইন করা আছে যা আমরা আমাদের প্রোগ্রামে ব্যবহার করতে পারি। পেরেন্ট-চাইল্ড ক্লাস হায়ারার্কি নিচে দেখানো হয়েছে:

সি++-এ সাধারণ এক্সেপশন ক্লাসগুলো:
| এক্সেপশন (Exception) | বিবরণ (Description) |
|---|---|
| std::exception | এটি একটি এক্সেপশন এবং সব স্ট্যান্ডার্ড সি++ এক্সেপশন এর পেরেন্ট ক্লাস। |
| std::bad_cast | dynamic_cast দ্বারা থ্রো করা এক্সেপশন। |
| std::bad_exception | সি++ প্রোগ্রামে অপ্রত্যাশিত এক্সেপশন হ্যান্ডেল করতে ব্যবহৃত হয়। |
| std::bad_alloc | সাধারণত new দ্বারা থ্রো করা হয়। |
| std::logic_failure | কোড পড়ে এই এক্সেপশন ডিটেক্ট করা যায়। |
| std::runtime_error | কোড পড়ে এই এক্সেপশন ডিটেক্ট করা যায় না। |
| std::bad_typeid | typeid দ্বারা থ্রো করা এক্সেপশন। |
কীওয়ার্ডসমূহ (Keywords):
এক্সেপশন হ্যান্ডেলিং-এ ৩টি কীওয়ার্ড আছে: try, catch এবং throw।
Try/Catch ব্লক:
সি++-এ, এক্সেপশন হ্যান্ডেলিং try/catch স্টেটমেন্ট ব্যবহার করে করা হয়। যে কোডে এক্সেপশন হতে পারে সেটি Try ব্লকে রাখা হয়। Catch ব্লক এক্সেপশন হ্যান্ডেল করতে ব্যবহৃত হয়।
উদাহরণ কোড
#include <iostream> using namespace std; class Sample1 { public: Sample1() { cout << "Construct an Object of sample1" << endl; } ~Sample1() { cout << "Destruct an Object of sample1" << endl; } }; class Sample2 { public: Sample2() { int i=7; cout << "Construct an Object of sample2" << endl; throw i; } ~Sample2() { cout << "Destruct an Object of sample2" << endl; } }; int main() { try { Sample1 s1; Sample2 s2; } catch(int i) { cout << "Caught " << i << endl; } }
আউটপুট
Construct an Object of sample1 Construct an Object of sample2 Destruct an Object of sample1 Caught 7
ইউজার ডিফাইনড এক্সেপশন (User Defined Exception):
আমরা exception ক্লাস ইনহেরিট (inherit) এবং ওভাররাইড (override) করে নিজের এক্সেপশন ডিফাইন করতে পারি।
উদাহরণ কোড
#include <iostream> #include <exception> using namespace std; struct DivideByZero : public exception { const char * what () const throw () { return "My Exception"; } }; int main() { try { throw DivideByZero(); } catch(DivideByZero& e) { cout << "Exception caught" << endl; cout << e.what() << endl; } catch(exception& e) { } }
আউটপুট
Exception caught My Exception what() = exception ক্লাসের একটি পাবলিক মেথড যা সব চাইল্ড এক্সেপশন ক্লাসে ওভাররাইড করা হয়েছে। এটি এক্সেপশনের কারণ রিটার্ন করে।