C ++ - 为什么'什么'在catch范围内打印“Unknown exception”?

时间:2011-08-10 21:22:47

标签: c++

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

复制

3 个答案:

答案 0 :(得分:5)

此程序导致未定义的行为。因为变量rtry块中声明为,所以在调用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
}

它会打印出您的预期。