ใน C++ การจัดการข้อยกเว้น (Exception Handling) เป็นกระบวนการสำหรับจัดการข้อผิดพลาดรันไทม์ (runtime errors) ข้อยกเว้น (Exception) เป็นเหตุการณ์ที่ถูกโยน (thrown) ในขณะรันไทม์ใน C++ ทุกข้อยกเว้นมาจากคลาส std::exception นี่คือข้อผิดพลาดรันไทม์ที่สามารถจัดการได้ มันพิมพ์ข้อความข้อยกเว้นและจบโปรแกรม หากเราไม่จัดการข้อยกเวนนั้น
ข้อยกเว้นถูกกำหนดในมาตรฐาน C++ เป็นคลาส <exception> ที่เราสามารถใช้ภายในโปรแกรมของเราได้ การจัดลำดับชั้นของคลาสพาเรนต์-ลูก (parent-child class hierarchy) ได้แสดงด้านล่างนี้

คลาสข้อยกเว้นทั่วไปใน C++ ได้แก่:
| ลำดับ | ข้อยกเว้นและคำอธิบาย |
|---|---|
| 1 | std::exception นี่คือข้อยกเว้นและคลาสพาเรนต์ของข้อยกเว้นมาตรฐาน C++ ทั้งหมด |
| 2 | std::bad_cast เป็นข้อยกเว้นที่ถูกโยนโดย dynamic_cast |
| 3 | std::bad_exception ข้อยกเว้นนี้ใช้จัดการข้อยกเว้นที่ไม่คาดคิดในโปรแกรม C++ |
| 4 | std::bad_alloc โดยทั่วไปจะถูกโยนโดย new |
| 5 | std::logic_failure ข้อยกเว้นนี้สามารถตรวจจับได้โดยการอ่านโค้ด |
| 6 | std::runtime_error ข้อยกเว้นนี้ไม่สามารถตรวจจับได้โดยการอ่านโค้ด |
| 7 | std::bad_typeid เป็นข้อยกเว้นที่ถูกโยนโดย typeid |
คีย์เวิร์ด
มีคีย์เวิร์ด 3 ตัวในการจัดการข้อยกเว้น: try, catch และ throw
บล็อก Try/Catch
ใน C++ การจัดการข้อยกเว้นทำได้โดยใช้คำสั่ง 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)
เราสามารถกำหนดข้อยกเว้นของเราเองได้โดยการสืบทอดและโอเวอร์ไรด์ (overriding) ฟังก์ชันการทำงานของคลาส exception
ตัวอย่างโค้ด
#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 และถูกโอเวอร์ไรด์โดยคลาสลูกข้อยกเว้นทั้งหมด มันคืนค่าสาเหตุของข้อยกเว้น