#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块。并给出以下例外,
但是,当我在很少修改的情况下运行这段代码时,就会遇到阻塞。
int main()
{
try
{
throw "exp";
throw "exp";
}
catch (...)
{
cout << "Why this doesn't call" << endl;
}
}
输出:
以上代码都引发了2个异常,那么为什么Compiler在析构函数的情况下有偏见?
答案 0 :(得分:4)
在第一种情况下,您首先从try
块抛出,然后从Cls
的析构函数中抛出堆栈展开。所以你有两个例外需要处理。 C ++通过调用terminate
来处理这种情况。
由于从析构函数中抛出的特性,C ++ 11定义了所有析构函数默认为noexcept
。然后,即使没有其他异常要处理,析构函数中的异常也会导致terminate
被调用。
第二种情况是正常的,因为只要你抛出第一个异常try
,就会在catch
块中处理异常。