C++ 编译器错误:析构函数的抛出说明符较松
要修复该错误,我看到的唯一选项是将C++ 编译器错误:析构函数的抛出说明符较松,c++,c++11,inheritance,exception,legacy-code,C++,C++11,Inheritance,Exception,Legacy Code,要修复该错误,我看到的唯一选项是将noexcept(false)添加到类ICantChange的析构函数中,因为它是一个库类,所以我不能这样做 我知道抛出析构函数是不好的,但现在我有了Test类,我想捕获当它被析构函数抛出的异常 有人能提出解决方案吗?您遇到的问题是析构函数或noexcept(true),因此,通过添加noexcept(false)的成员,您就违背了承诺 但不要加入析构函数:您可以在析构函数内部处理异常。还要注意的是,您将需要再次运行析构函数,以便对象实际被析构函数。如何执行?您
noexcept(false)
添加到类ICantChange
的析构函数中,因为它是一个库类,所以我不能这样做
我知道抛出析构函数是不好的,但现在我有了Test
类,我想捕获当它被析构函数抛出的异常
有人能提出解决方案吗?您遇到的问题是析构函数或
noexcept(true)
,因此,通过添加noexcept(false)
的成员,您就违背了承诺
但不要加入析构函数:您可以在析构函数内部处理异常。还要注意的是,您将需要再次运行析构函数,以便对象实际被析构函数。如何执行?您可以共享代码吗?捕获异常与引发异常不同。只需使用try/catch,就像@VTT所说的那样,重新运行析构函数。但它不会挂起异常,对吗?程序仍将中止?请查看以下内容:
#include <iostream>
struct ICantChange
{
virtual ~ICantChange() {}
};
struct ClassThatThrows
{
virtual ~ClassThatThrows() noexcept(false)
{
throw 44;
}
};
struct Test : ICantChange
{
~Test()
{
}
ClassThatThrows instance;
};
main()
{
try
{
Test obj;
}
catch(int except)
{
std::cout << "caught" << std::endl;
}
}
main.cpp:20:5: error: looser throw specifier for ‘virtual Test::~Test() noexcept (false)’
~Test()
^
main.cpp:6:13: error: overriding ‘virtual ICantChange::~ICantChange() noexcept’
virtual ~ICantChange() {}