try
{
range_error r("Hi I am hereeeee!");
cout << r.what() << endl; // print "Hi I am hereeeee!" // case one
exception *p2 = &r;
cout << p2->what() << endl; // print "Hi I am hereeeee!" // case two
throw p2;
}
catch (exception *e)
{
cout << e->what() << endl; // print "Unknown exception" // case three
}
Question>
I don’t know why case three prints “Unknown exception” instead of “Hi I am hereeeee!”?
The printed result is copied from VS2010
This program results in undefined behavior. Because the variable
ris declared inside thetryblock, it goes out of scope before the catch handler is invoked. At this point,epoints to some area on the stack where an object of typerange_errorused to exist.The following program should print the expected results:
However, you should not throw a pointer to an object, you should throw the object itself. The run-time library will store a copy of the
range_errorobject and pass that copy to the exception handler.Thus, you should use the following code instead: