Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การทำงานของข้อยกเว้น (Exceptions) ใน C++


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

ข้อยกเว้นถูกกำหนดในมาตรฐาน C++ เป็นคลาส <exception> ที่เราสามารถใช้ภายในโปรแกรมของเราได้ การจัดลำดับชั้นของคลาสพาเรนต์-ลูก (parent-child class hierarchy) ได้แสดงด้านล่างนี้

การทำงานของข้อยกเว้น (Exceptions) ใน C++

คลาสข้อยกเว้นทั่วไปใน 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 และถูกโอเวอร์ไรด์โดยคลาสลูกข้อยกเว้นทั้งหมด มันคืนค่าสาเหตุของข้อยกเว้น