條款8:不能讓異常逃離解構函式,否則難以想象
1、c++並不禁止解構函式吐出異常,但它不鼓勵你這樣做。
例:vector存的結構是class的話,當vector被銷燬時,如果兩個class在析構的時候丟擲異常,程式若不是結束執行就是導致不明確行為。
2、如果解構函式必須執行一個動作,該動作可能會失敗丟擲異常,該怎麼辦?
(1)如果丟擲異常,通過呼叫abort直接結束程式;
try {
db.close(); //失敗了可能丟擲異常
}
catch ( ){
//記錄;
std::abort();
}
(2)吞下發生的異常。
try {
db.close(); //失敗了可能丟擲異常
}
catch ( ){
//記錄;
}
(2
3、如果需要對某個操作函式執行期間丟擲的異常做出反應,那麼class應該提供一個普通函式(而非在解構函式中)執行該操作。
class DBConn{
public:
void close(){
db.close();
closed = true;
}
~DBConn(){
if(!closed){
try {
db.close();
}
catch (){
//記錄,並結束程式或者吞下異常;
}
}
}
private :
BDConection db;
bool closed;
};