Xử lý ngoại lệ trong C++ là quá trình xử lý lỗi runtime. Ngoại lệ là sự kiện ném ra lúc chạy. Tất cả ngoại lệ kế thừa từ std::exception. Nếu không bắt, chương trình in thông báo và kết thúc.
Các lớp ngoại lệ phổ biến:
| Ngoại lệ | Mô tả |
|---|---|
| std::exception | Lớp cha của tất cả ngoại lệ chuẩn C++. |
| std::bad_cast | Ném bởi dynamic_cast. |
| std::bad_exception | Xử lý ngoại lệ bất ngờ. |
| std::bad_alloc | Thường ném bởi new khi cấp phát thất bại. |
| std::logic_failure | Phát hiện được bằng đọc mã. |
| std::runtime_error | Không phát hiện được bằng đọc mã. |
| std::bad_typeid | Ném bởi typeid. |
Từ khóa
Ba từ khóa: try, catch, throw.
Khối Try/Catch
Code có thể gây ngoại lệ đặt trong try. Catch xử lý ngoại lệ.
Ví dụ
#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;
}
return 0;
}
Kết quả
Construct an Object of sample1 Construct an Object of sample2 Destruct an Object of sample1 Caught 7
Ngoại lệ tự định nghĩa
Kế thừa từ exception và ghi đè what().
Ví dụ
#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) { }
return 0;
}
Kết quả
Exception caught My Exception