版权声明:本文为博主原创文章,转载请注明出处并附带本文链接。 https://blog.csdn.net/IOT_Flower/article/details/78626166
不要让异常出现在析构函数里,如果是析构函数中调用的函数导致的异常,应在析构函数中对异常作出处理(try,catch),吞下异常(不传播)或结束程序。举例中close()是需要调用的函数。
① 如果程序遭遇一个“于析构期间发生的错误”后无法继续执行,“强迫结束程序”是个合理选项,毕竟它可以阻止异常从析构函数中传播出去。如果想要抛出异常后结束,通常通过调用abort完成:
A::~A()
{
try{
close();
}
catch(…){
//记录调用失败
std::abort();
}
}
②一般来说将异常吞掉是个坏主意,但有时候也比草率结束程序或者导致不明确行为要好。如果想要吞下异常:
A::~A()
{
try{
close();
}
catch(…){
//记录调用失败
}
}
③以上两种方法都没办法对可能出现的问题作出处理,因此最佳的策略是重新设计接口,让用户可以自行对程序运行期间抛出的异常进行处理,当用户没有处理的时候才调用析构函数里的函数。那么类中应该提供一个普通的函数(非析构函数)执行该操作:
class A{
public:
void func()
{
close();
closed=true;
}
~A()
{
if(!closed)
{
try{
close();
}
catch(…){
//记录调用失败
}
}
}
private:
bool closed;
}