Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Cơ bản xử lý ngoại lệ (Exception Handling) trong C++


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::exceptionLớp cha của tất cả ngoại lệ chuẩn C++.
std::bad_castNém bởi dynamic_cast.
std::bad_exceptionXử lý ngoại lệ bất ngờ.
std::bad_allocThường ném bởi new khi cấp phát thất bại.
std::logic_failurePhát hiện được bằng đọc mã.
std::runtime_errorKhông phát hiện được bằng đọc mã.
std::bad_typeidNé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