C++并不禁止析构函数吐出异常,但它不鼓励你这样做。
但是如果你的析构函数必须执行一个动作,而该动作可能会在失败时抛出异常,该怎么办?例如:
class DBConn {
public:
...
~DBConn()
{
db.close() //关闭数据库连接 有可能发出异常
}
private:
DBConnection db; //一个负责数据库连接的类
};
上面的代码没有对异常做任何的处理,这个异常会传播出去,这个会对软件很大的麻烦。有两个方法可以避免这个问题:
1,如果close抛出异常就结束程序,通常通过调用about完成
DBConn::~DBConn()
{
try {db.close(); }
catch(...)
{
制作运转记录,记下对close的调用失败;
std::abort(); //结束程序
}
}
2,吞下因调用close而发生的异常
DBConn::~DBConn()
{
try {db.close(); }
catch(...)
{
制作运转记录,记下对close的调用失败;
}
}
总结:
1) 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕获任何异常,然后吞下它们(不传播)或结束程序
2) 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应提供一个普通函数(而非要析构函数中)执行该操作
Effective C++读书笔记之别让异常逃离析构函数
最新推荐文章于 2023-04-16 09:26:43 发布