假設(shè)你使用一個class 負(fù)責(zé)數(shù)據(jù)庫連接:
class DBConnection {public:
static DBConnection create(); // 這個函數(shù)返回DBConnection對象;
void close(); // 關(guān)閉聯(lián)機(jī); 失敗則拋出異常
};
創(chuàng)建一個用來管理DBConnection 資源的class , 并在其析構(gòu)函數(shù)中調(diào)用close。
class DBConn {public:
~DBConn() {// 確保數(shù)據(jù)庫連接總是會被關(guān)閉
db.close();
}
private:
DBConnection db{};
};
這便允許客戶寫出這樣的代碼:
{// 開啟一個區(qū)塊(block)。
DBConn dbc(DBConnection::create()); // 建立DBConnection對象并交給DBConn 對象以便管理
// 通過DBConn的接口
// 使用 DBConnection對象
// 在區(qū)塊結(jié)束點, DBConn對象
// 被銷毀, 因而自動
// 為DBConnection 對象調(diào)用close
}
&nbs; 如果該調(diào)用導(dǎo)致異常, DBConn析構(gòu)函數(shù)會傳播該異常, 也就是允許它離開這個析構(gòu)函數(shù)。 那會造成問題, 因為那就是拋出了難以駕馭的麻煩。
DBConn::~DBConn() {try{db.close();
} catch (...) {制作運(yùn)轉(zhuǎn)記錄, 記下對close的調(diào)用失敗;
std::abort();
}
}
如果程序遭遇一個"在析構(gòu)期間發(fā)生的錯誤"后無法繼續(xù)執(zhí)行, “強(qiáng)迫結(jié)束程序”是個合理選項。 畢竟它可以阻止異常從析構(gòu)函數(shù)傳播出去(那會導(dǎo)致不明確的行為)。
2. 吞下因調(diào)用close而發(fā)生的異常
DBConn::~DBConn()
{try {db.close();
}
catch (...) {制作運(yùn)轉(zhuǎn)記錄, 記下對close的調(diào)用失敗;
}
}
一個較佳策略是重新設(shè)計DBConn接口, 使其客戶有機(jī)會對可能出現(xiàn)的問題作出反應(yīng)。
class DBConn {public:
void close(){// 供客戶使用的新函數(shù)
db.close();
closed = true;
}
~DBConn() {if (!closed) { try {// 關(guān)閉連接
db.close();
}
catch (...) { // 如果關(guān)閉動作失敗,
制作運(yùn)轉(zhuǎn)記錄, 記下對close的調(diào)用失敗; // 記錄下來并結(jié)束程序
} // 或吞下異常
}
}
private:
DBConnection db;
bool closed;
};
總結(jié):
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁名稱:條款08:別讓異常逃離析構(gòu)函數(shù)-創(chuàng)新互聯(lián)
URL標(biāo)題:http://chinadenli.net/article34/dgdgpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、電子商務(wù)、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計公司、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容