Throw exception trong constructor nhưng destructor vẫn được gọi?

E đọc các tài liệu thì trong constructor c++ khi đã throw thì xem như object không được khởi tạo thành công, do đó destructor không được gọi. Tuy nhiên trường hợp của em thế này:

//Constructor
Date::Date(int m, int d, int y){
    try{
        if (CheckValidDate(m,d,y)){
       cout << "Date object constructor for date ";
       printf("%d/%d/%d", m, d, y);
       cout<< endl;
       } else throw 505;
    }
    catch(...){};

    day = d;
    month = m;
    year = y;
}
// Destructor
Date::~Date(){
    cout << "Date object destructor for date ";
    print();
    cout<< endl;
}

image

Chương trình có 3 test case, 2 case đầu là định dạng hợp lệ, case 3 thì không. Khi chạy theo em dự tính thì case 3 sẽ không có thông báo của cả constructor và destructor; tuy nhiên, nó lại hiện thông báo của destructor? Làm thế nào để xử lí ạ :>

Sao lại bao dòng throw trong try - catch luôn vậy? Bạn làm thế thì thành ra vô nghĩa à? Tự bạn ném ngoại lệ và cũng tự bạn bắt ngoại lệ đó. Mục đích throw là cho chỗ khác try -catch, chính là chỗ truyền tham số tự bắt.
Bạn làm thế gọi là “giấu lỗi” đấy!

#include <iostream>
class X{
    int val;
    public:
    X(int v){
        std::cout<<"Constructor with value: "<<v<<"\n";
        // no try - catch
        if(v<0){
            std::cout<<"Invalid "<<v<<"\n";
            throw 505; // exception code
        }
        std::cout<<"OK "<<v<<"\n";
        this->val = v;
    }
    ~X(){
        std::cout<<"Destructor with value: "<<this->val<<"\n";
    }
};
int main()
{
    X *a, *b, *c;
    // try - catch
    try{
       a = new X(900);
       b = new X(0);
       c = new X(-999);
    }catch(int e){
        std::cout<<"Catch with exception code: "<<e<<"\n";
    }
    delete c; // no effect
    delete a;
    delete b;
    return 0;
}

Kết quả:

Constructor with value: 900
OK 900
Constructor with value: 0
OK 0
Constructor with value: -999
Invalid -999
Catch with exception code: 505
Destructor with value: 900
Destructor with value: 0
10 Likes

Anh ơi, try đặt chỗ khác trong main đc ko? Tại biến chương trình e không phải con trỏ nên khi khai báo các biến trong try thì nó chỉ được định nghĩa trong block đó, ra ngoài không dùng được (Chẳng hạn gọi phương thức của object đó);

Đặt try -catch đâu cũng được.
Mình làm như trên là bao 1 lầm cả cụm 3 biến. Bạn tách ra từng cái theo ý của bạn, phải linh hoạt chứ bạn, đâu có ai quy định try - catch phải bao cả 1 cụm hoặc chỉ dùng với con trỏ đâu!?
Thế này cũng được vậy:

    try{
       X a = X(900);
       a.someFunc();
    }catch(int e){
        std::cout<<"Catch with exception code: "<<e<<"\n";
    }
    try{
       X b = X(0);
       b.someFunc();
    }catch(int e){
        std::cout<<"Catch with exception code: "<<e<<"\n";
    }
    try{
       X c = X(-999);
       c.someFunc();
    }catch(int e){
        std::cout<<"Catch with exception code: "<<e<<"\n";
    }
Constructor with value: 900
OK 900
Do something with value: 900
Destructor with value: 900
Constructor with value: 0
OK 0
Do something with value: 0
Destructor with value: 0
Constructor with value: -999
Invalid -999
Catch with exception code: 505
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?