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
}
问题&GT;
我不知道为什么案例三会打印“Unknown exception”而不是“Hi i am heeeeee!”? 打印结果从VS2010
复制答案 0 :(得分:5)
此程序导致未定义的行为。因为变量r
在 try
块中声明为,所以在调用catch处理程序之前它会超出范围。此时,e
指向堆栈中某些区域,其中range_error
类型的对象已用于。
以下程序应打印预期结果:
range_error r("Hi I am hereeeee!");
try
{
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 "Hi I am hereeeee!" // case three
}
但是,您不应该抛出指向对象的指针,您应该抛出对象本身。运行时库将存储range_error
对象的副本,并将该副本传递给异常处理程序。
因此,您应该使用以下代码:
try
{
range_error r("Hi I am hereeeee!");
cout << r.what() << endl; // print "Hi I am hereeeee!" // case one
throw r;
}
catch (const exception& e)
{
cout << e.what() << endl; // print "Hi I am hereeeee!" // case two
}
答案 1 :(得分:3)
因为当你到达catch
时,你的range_error
已经被摧毁,你正在捕捉一个悬垂的指针。将range_error
声明移到try
块之外,或者更好的是,抛出一个实例并通过引用捕获。
答案 2 :(得分:1)
因为在捕获异常时指向异常对象已超出范围。如果你写了
range_error r("Hi I am hereeeee!");
try
{
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
}
它会打印出您的预期。