//Effective C++ Item08
#include<iostream>
#include<cstring>
using namespace std;
//析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序
//如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。
//例如对于std::vector<Widget> v,当vector v被销毁,它有责任销毁其内含的所有Widgets
//假如在析构第1个和第2个Widget时都抛出了异常,就有2个同时作用的异常。在两个异常同时存在的情况下,程序若不是结束执行就是导致不明确行为。
class DBConnection{
public:
static DBConnection create();
void close();
};
//创建DBConn用来管理DBConnection资源,为确保客户不忘记在DBConnection对象身上调用close,在析构函数中调用close
class DBConn{
public:
DBConn(DBConnection db){
this->db = db;
closed = false;
}
void close(){
db.close();
closed = true;
}
//在析构函数中必须对异常进行处理,或者结束程序,或者吞下因调用close而发生的异常
~DBConn(){
if (!closed){
try{
db.close();
}
catch (std::exception){
//...//制作运转记录,记下对close的调用失败
//std::abort();
}
}
}
private:
DBConnection db;
bool closed;
};
int main(){
DBConn dbc(DBConnection::create());
}
Effective C++ Iem08 Note
最新推荐文章于 2023-03-06 20:18:39 发布