If in my code I have the following snippet:
try { doSomething(); } catch (...) { doSomethingElse(); throw; }
Will the throw rethrow the specific exception caught by the default ellipsis handler?
The code which can throw any exception is kept inside(or enclosed in) a try block. Then, when the code will lead to any error, that error/exception will get caught inside the catch block.
If a catch block cannot handle the particular exception it has caught, you can rethrow the exception. The rethrow expression ( throw without assignment_expression) causes the originally thrown object to be rethrown.
Your function will terminate immediately, and it won't return anything. If there are no catch statements catching the exception "up the call chain", your application will terminate.
In C++, inside catch block we can re-throw an exception using throw statement, but the thrown exception should have the same type as the current caught one.
Yes. The exception is active until it's caught, where it becomes inactive. But it lives until the scope of the handler ends. From the standard, emphasis mine:
§15.1/4: The memory for the temporary copy of the exception being thrown is allocated in an unspecified way, except as noted in 3.7.4.1. The temporary persists as long as there is a handler being executed for that exception.
That is:
catch(...) { // <-- /* ... */ } // <--
Between those arrows, you can re-throw the exception. Only when the handlers scope ends does the exception cease to exist.
In fact, in §15.1/6 the example given is nearly the same as your code:
try { // ... } catch (...) { // catch all exceptions // respond (partially) to exception <-- ! :D throw; //pass the exception to some // other handler }
Keep in mind if you throw
without an active exception, terminate
will be called. This cannot be the case for you, being in a handler.
If doSomethingElse()
throws and the exception has no corresponding handler, because the original exception is considered handled the new exception will replace it. (As if it had just thrown, begins stack unwinding, etc.)
That is:
void doSomethingElse(void) { try { throw "this is fine"; } catch(...) { // the previous exception dies, back to // using the original exception } try { // rethrow the exception that was // active when doSomethingElse was called throw; } catch (...) { throw; // and let it go again } throw "this replaces the old exception"; // this new one takes over, begins stack unwinding // leaves the catch's scope, old exception is done living, // and now back to normal exception stuff } try { throw "original exception"; } catch (...) { doSomethingElse(); throw; // this won't actually be reached, // the new exception has begun propagating }
Of course if nothing throws, throw;
will be reached and you'll throw your caught exception as expected.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With