Exception is caught twice
c++, constructor, exception
Solution
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. [...]
Problem
``` 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?