條款08:別讓異常逃離析構(gòu)函數(shù)-創(chuàng)新互聯(lián)

假設(shè)你使用一個(gè)class 負(fù)責(zé)數(shù)據(jù)庫(kù)連接:

10年積累的做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有桂陽(yáng)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
class DBConnection {public:
	static DBConnection create(); // 這個(gè)函數(shù)返回DBConnection對(duì)象;
	void close(); // 關(guān)閉聯(lián)機(jī); 失敗則拋出異常
};

創(chuàng)建一個(gè)用來管理DBConnection 資源的class , 并在其析構(gòu)函數(shù)中調(diào)用close。

class DBConn {public:
	~DBConn() {// 確保數(shù)據(jù)庫(kù)連接總是會(huì)被關(guān)閉
		db.close();
	}
private:
	DBConnection db{};
};

這便允許客戶寫出這樣的代碼:

{// 開啟一個(gè)區(qū)塊(block)。
DBConn dbc(DBConnection::create());	// 建立DBConnection對(duì)象并交給DBConn 對(duì)象以便管理
									// 通過DBConn的接口
									// 使用 DBConnection對(duì)象
									// 在區(qū)塊結(jié)束點(diǎn), DBConn對(duì)象
									// 被銷毀, 因而自動(dòng)
									// 為DBConnection 對(duì)象調(diào)用close
}

&nbs; 如果該調(diào)用導(dǎo)致異常, DBConn析構(gòu)函數(shù)會(huì)傳播該異常, 也就是允許它離開這個(gè)析構(gòu)函數(shù)。 那會(huì)造成問題, 因?yàn)槟蔷褪菕伋隽穗y以駕馭的麻煩。

  1. 如果close 拋出異常就結(jié)束程序。 通常通過調(diào)用abort完成:
DBConn::~DBConn() {try{db.close();
	} catch (...) {制作運(yùn)轉(zhuǎn)記錄, 記下對(duì)close的調(diào)用失敗;
		std::abort();
	}
}

如果程序遭遇一個(gè)"在析構(gòu)期間發(fā)生的錯(cuò)誤"后無法繼續(xù)執(zhí)行, “強(qiáng)迫結(jié)束程序”是個(gè)合理選項(xiàng)。 畢竟它可以阻止異常從析構(gòu)函數(shù)傳播出去(那會(huì)導(dǎo)致不明確的行為)。
2. 吞下因調(diào)用close而發(fā)生的異常

DBConn::~DBConn() 
{try {db.close();
	} 
	catch (...) {制作運(yùn)轉(zhuǎn)記錄, 記下對(duì)close的調(diào)用失敗;
	}
}

一個(gè)較佳策略是重新設(shè)計(jì)DBConn接口, 使其客戶有機(jī)會(huì)對(duì)可能出現(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)閉動(dòng)作失敗,
				制作運(yùn)轉(zhuǎn)記錄, 記下對(duì)close的調(diào)用失敗; 	// 記錄下來并結(jié)束程序
			}										// 或吞下異常
		}
	}
	private:
		DBConnection db;
		bool closed;
};

總結(jié):

  1. 析構(gòu)函數(shù)絕對(duì)不要吐出異常。 如果一個(gè)被析構(gòu)函數(shù)調(diào)用的函數(shù)可能拋出異常, 析構(gòu)函數(shù)應(yīng)該捕獲任何異常, 然后吞下它們或結(jié)束程序。
  2. 如果客戶需要對(duì)某個(gè)操作函數(shù)運(yùn)行期間拋出的異常做出反應(yīng), 那么class應(yīng)該提供一個(gè)普通函數(shù)(而非在析構(gòu)函數(shù)中)執(zhí)行該操作。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁(yè)名稱:條款08:別讓異常逃離析構(gòu)函數(shù)-創(chuàng)新互聯(lián)
URL標(biāo)題:http://bm7419.com/article34/dgdgpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、電子商務(wù)企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)