下面的代码通过给出错误退出
是由于析构函数引发异常吗?我知道从析构函数抛出异常会导致未定义的行为,但是也有计数器参数。而且该程序在VS 2012中可以正常运行。
#include "stdafx.h"
#include<iostream>
using namespace std;
class Txn
{
public:
Txn()
{
cout<< "in Constructor" << endl;
};
~Txn()
{
try
{
cout << "in destructor" << endl;
throw 10;
}
catch(int i)
{
cout << "in destructor exception" << endl;
throw;
}
}
};
int main()
{
try
{
Txn t;
}
catch (int i)
{
cout << "Exception" << i << endl;
}
return 0;
}
VS2017发行说明未提及任何有关异常处理更改的内容。
所以我有以下问题:
请提出建议。
最佳答案
这里的问题是默认情况下所有析构函数都是noexcept(true)
。抛出异常而不更改will将立即调用std::terminate
。如果我们使用
class Txn
{
public:
Txn()
{
cout<< "in Constructor" << endl;
};
~Txn() noexcept(false)
{
try
{
cout << "in destructor" << endl;
throw 10;
}
catch(int i)
{
cout << "in destructor exception" << endl;
throw;
}
}
};
int main()
{
try
{
Txn t;
}
catch (int i)
{
cout << "Exception" << i << endl;
}
return 0;
}
该程序将按预期运行。
这在VS2012中起作用但在VS2017中不起作用的原因是在C++ 11之前,析构函数可能会抛出,而无需指定它。使用C++ 11的
noexcept
说明符以及默认情况下所有析构函数均为noexcept
的更改导致其在VS2017中中断。