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

Ném ngoại lệ (throw exception) từ constructor trong C++


Constructor có thể ném ngoại lệ. Nếu constructor ném exception, destructor của đối tượng không được gọi (vì đối tượng chưa hoàn thành xây dựng). Tuy nhiên, các thành viên đã khởi tạo xong sẽ được hủy đúng thứ tự (stack unwinding).

Ví dụ

#include <iostream>
using namespace std;

class A {
public:
    A() { cout << "A constructed\n"; }
    ~A() { cout << "A destroyed\n"; }
};
class B {
public:
    B() { cout << "B constructed\n"; throw 42; }
    ~B() { cout << "B destroyed\n"; } // Sẽ KHÔNG chạy
};

int main() {
    try {
        A a; // Tạo A trước
        B b; // Constructor B ném exception
    } catch (int e) {
        cout << "Caught: " << e << endl;
    }
    return 0;
}

Kết quả

A constructed
B constructed
A destroyed
Caught: 42

Chú ý: B::~B() không chạy, nhưng A::~A() chạy do stack unwinding.