Re: An exception that throws while it is being thrown, no terminate?
Niels Dekker - no reply address wrote:
Martin B. wrote:
How do you verify that the copy-ctor is called?
Have you added some tracing, do you set a breakpoint?
Yes, when I run within Visual Studio 2008, having a breakpoint in the
copy-constructor, it gets there.
Are you running the process under the debugger?
.........
Are you able to reproduce it? Maybe a slightly extended main() function
could be helpful, as follows:
//////////////////////////////////////////////////
int main()
{
const MyException constException("what");
try
{
// Here the copy-constructor is called:
throw constException;
}
catch( MyException & referenceToMyException )
{
// Modify the exception. So this must be a copy!
// Note that we don't actually get here.
referenceToMyException = MyException("");
}
catch( std::bad_alloc & )
{
// Here is where we get!
return EXIT_FAILURE;
}
// This line is never reached.
return 0;
}
//////////////////////////////////////////////////
Here I hope you see more clearly that constException *must* be copied, in
order to support the /potential/ assignment to referenceToMyException. (Note
that the original exception object is "const".) Also I added "return 0" at
the end, for clarity. Although it is never reached, because the program
always returns EXIT_FAILURE, when compiled on VC. Please let me know if you
agree that std::terminate should be called instead!
I've tried this with VS2005 (VC8) and I can confirm the behaviour,
however I would like to add the following:
a) throw MyException("anonymous") + catch-by-ref = This will *not*
invoke the copy-ctor and so will correctly catch MyException by reference
b) throw MyException("anonymous") + catch-by-value = This needs a
copy-ctor call at the catch site, and it *will* correctly call
std::terminate
c) const MyException cExcObj("named const") + throw cExcObj + catch-by-*
= This requires a copy-ctor call, but the copy-ctor call is done
*before* the throw and thus it will just raise the bad_alloc.
From what James wrote, I guess this is non std compliant.
br,
Martin