user1540043
user1540043

Reputation: 163

Exception is caught twice

class A{
    public:
        A() { throw string("exception A"); };
};

class B{
    A a;
    public:
        B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; };
};

int main(){    
    try{
        B b;
    }catch(string& s){
        cout << &s << " " << s << endl;
    }
    return 0;
}

The output is:

0x32c88 exception A
0x32c88 exception A

Since the exception was already caught in the constructor of B, why it still occur in the main function?

Upvotes: 13

Views: 754

Answers (1)

CB Bailey
CB Bailey

Reputation: 792099

When the flow of contol reaches the end of the handler for a function-try-block of a constructor, the caught exception will automatically be re-thrown.

You cannot suppress an exception thrown during the construction of a base class or member in a derived class constructor as this would lead to a constructed derived object with a base or member that had failed to be constructed.

This GOTW is relevant: http://www.gotw.ca/gotw/066.htm

From ISO/IEC 14882:2011 15.3 [except.handle] / 15:

The currently handled exception is rethrown if control reaches the end of a handler of the function-try-block of a constructor or destructor. [...]

Upvotes: 22

Related Questions