class DBConn //这个class用来管理DBConnction对象
{
public:
//自己设计一个新的DBConn接口 方法3
void close()
{
db.close();
closed = true;
}
~DBConn() //确保数据库连接总是会被关闭
{
//db.close();
if (!closed)
{
try
{
db.close();
}
catch()
{
//制作运转记录,记下对close的调用失
}
}
}
protected:
private:
DBconnection db;
bool closed;
};
//假如调用析构函数发送错误,导致异常。析构函数会传播该异常,这时该怎么办?
//
DBConn::~DBConn
{
try
{
db.close();
}
catch ()
{
//制作运转记录,记下对close的调用失败 方法1
// abort(); //终止某个进程 方法2
}
};
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
记住:
1、析构函数绝对不要吐出异常。如果一个被析构的函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吐下他们或结束程序。
2、如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(不是在析构函数中)执行该操作。
Effective C++ 条款八 别让异常逃离析构函数