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.