下面的代码通过给出错误退出



是由于析构函数引发异常吗?我知道从析构函数抛出异常会导致未定义的行为,但是也有计数器参数。而且该程序在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发行说明未提及任何有关异常处理更改的内容。

所以我有以下问题:
  • 从VS2017开始在析构函数中引发异常是否不正确?是否总是通过调用abort()退出程序?
  • 有没有可以使用它的标志?

  • 请提出建议。

    最佳答案

    这里的问题是默认情况下所有析构函数都是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中中断。

    10-08 01:17