Effective C++ Iem08 Note

来源:互联网 发布:正方教务网络管理系统 编辑:程序博客网 时间:2024/05/20 18:50
//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,在析构函数中调用closeclass 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());}

0 0
原创粉丝点击