第一个原因
Session::Session(){ //构造函数
logCreation(this);
startTransaction(); //启动数据传送
}
Session::~Session(){ //析构函数
logDestruction(this);
endTransaction(); //结束数据传送
}
设想如果在析构函数的logDestruction函数中抛出异常,那么
endTransaction就不会被调用,因为异常发生之后异常点(即logDestruction)之后的语句块不会被执行。因此会产生资源泄漏。
解决方法如下
Session::Session(){ //构造函数
logCreation(this);
startTransaction(); //启动数据传送
}
Session::~Session(){ //析构函数
try{
logDestruction(this);
}catch(...){
endTransaction(); //结束数据传送
}
}
第二个原因是主要原因
当执行到某个语句块时假如产生了异常,那么在异常发生前已经构造好的对象将会被销毁,很明显是调用这些对象的析构函数进行销毁,假如这些析构函数又产生了异常,那么此时存在两个异常。系统无法处理这些异常,所以会调用terminate函数终止这个程序,这当然不是我们希望看到的,解决的方法就是让所有类的对象的析构函数不能抛出异常。