为什么C ++偏向于析构函数的异常?

时间:2014-03-14 07:00:52

标签: c++ exception compiler-construction destructor

#include <iostream>
using namespace std;
class Cls
{
public:
    ~Cls()
    {
        throw "exp";
    }
};

int main()
{
    try
    {
        Cls   c;
        throw "exp";
    }
    catch (...)
    {
        cout << "Why this doesn't call" << endl;
    }
}

当我执行此代码时,它不会进入catch块。并给出以下例外, enter image description here

但是,当我在很少修改的情况下运行这段代码时,就会遇到阻塞。

int main()
{
    try
    {
        throw "exp";
        throw "exp";
    }
    catch (...)
    {
        cout << "Why this doesn't call" << endl;
    }
}

输出: enter image description here

以上代码都引发了2个异常,那么为什么Compiler在析构函数的情况下有偏见?

1 个答案:

答案 0 :(得分:4)

在第一种情况下,您首先从try块抛出,然后从Cls的析构函数中抛出堆栈展开。所以你有两个例外需要处理。 C ++通过调用terminate来处理这种情况。

由于从析构函数中抛出的特性,C ++ 11定义了所有析构函数默认为noexcept。然后,即使没有其他异常要处理,析构函数中的异常也会导致terminate被调用。

第二种情况是正常的,因为只要你抛出第一个异常try,就会在catch块中处理异常。