C++異常安全的思考與合理應(yīng)用

1. 什么是異常蕊蝗?什么時(shí)候會(huì)拋出異常?什么時(shí)候需要代碼異常安全的保證赖舟?為什么需要異常安全蓬戚?異常的產(chǎn)生、捕捉宾抓、處理子漩、傳遞?

給出沒有異常安全保證的代碼的實(shí)例與分析

C++ 標(biāo)準(zhǔn)的異常

C++ 提供了一系列標(biāo)準(zhǔn)的異常石洗,定義在 <exception> 中幢泼,我們可以在程序中使用這些標(biāo)準(zhǔn)的異常。它們是以父子類層次結(jié)構(gòu)組織起來的讲衫,如下所示:


std::exception 該異常是所有標(biāo)準(zhǔn) C++ 異常的父類缕棵。
std::bad_alloc 該異常可以通過 new 拋出涉兽。
std::bad_cast 該異痴新浚可以通過 dynamic_cast 拋出。
std::bad_exception 這在處理 C++ 程序中無法預(yù)期的異常時(shí)非常有用枷畏。
std::bad_typeid 該異潮鹄澹可以通過 typeid 拋出。
std::logic_error 理論上可以通過讀取代碼來檢測到的異常拥诡。
std::domain_error 當(dāng)使用了一個(gè)無效的數(shù)學(xué)域時(shí)触趴,會(huì)拋出該異常。
std::invalid_argument 當(dāng)使用了無效的參數(shù)時(shí)渴肉,會(huì)拋出該異常冗懦。
std::length_error 當(dāng)創(chuàng)建了太長的 std::string 時(shí),會(huì)拋出該異常仇祭。
std::out_of_range 該異撑可以通過方法拋出,例如 std::vector 和 std::bitset<>::operator
std::runtime_error 理論上不可以通過讀取代碼來檢測到的異常嚣艇。
std::overflow_error 當(dāng)發(fā)生數(shù)學(xué)上溢時(shí)承冰,會(huì)拋出該異常。
std::range_error 當(dāng)嘗試存儲(chǔ)超出范圍的值時(shí)食零,會(huì)拋出該異常困乒。
std::underflow_error 當(dāng)發(fā)生數(shù)學(xué)下溢時(shí),會(huì)拋出該異常贰谣。

2. 什么是異常安全娜搂?異常安全的等級(jí)有哪些?

一段代碼是異常安全的吱抚,如果這段代碼運(yùn)行時(shí)的失敗不會(huì)產(chǎn)生有害后果百宇,如內(nèi)存泄露、存儲(chǔ)數(shù)據(jù)混淆秘豹、或無效的輸出携御。

異常中立性

是指當(dāng)你的代碼(包括你調(diào)用的代碼)引發(fā)異常時(shí),這個(gè)異常能保持原樣傳遞到外層調(diào)用代碼

異常安全性

  • 拋出異常后既绕,資源不泄露
  • 拋出異常后啄刹,不會(huì)使原有數(shù)據(jù)惡化(例如正常指針變野指針)

異常安全等級(jí)

不拋異常保證(no throw guarantee) > 強(qiáng)烈保證(the strong guarantee) > 基本保證(the basic guarantee)> 無泄漏保證(no-leak guarantee) > 異常不安全(no exception safety)

3. 如何保證代碼實(shí)現(xiàn)(設(shè)計(jì))符合某個(gè)異常安全等級(jí)?

不拋出保證 只使用內(nèi)置類型凄贩,使用noexcept關(guān)鍵字
強(qiáng)烈保證 copy-and-swap
基本保證 RAII 智能指針

4. 異常安全的低層實(shí)現(xiàn)原理與開銷計(jì)算誓军?

棧回退(未完待續(xù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疲扎,一起剝皮案震驚了整個(gè)濱河市昵时,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椒丧,老刑警劉巖债查,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瓜挽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)征绸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門久橙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人管怠,你說我怎么就攤上這事淆衷。” “怎么了渤弛?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵祝拯,是天一觀的道長。 經(jīng)常有香客問我,道長佳头,這世上最難降的妖魔是什么鹰贵? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮康嘉,結(jié)果婚禮上碉输,老公的妹妹穿的比我還像新娘。我一直安慰自己亭珍,他們只是感情好敷钾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肄梨,像睡著了一般阻荒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上众羡,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天侨赡,我揣著相機(jī)與錄音,去河邊找鬼纱控。 笑死辆毡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甜害。 我是一名探鬼主播舶掖,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼尔店!你這毒婦竟也來了眨攘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤嚣州,失蹤者是張志新(化名)和其女友劉穎鲫售,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體该肴,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡情竹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匀哄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦效。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涎嚼,靈堂內(nèi)的尸體忽然破棺而出阱州,到底是詐尸還是另有隱情,我是刑警寧澤法梯,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布苔货,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏夜惭。R本人自食惡果不足惜姻灶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滥嘴。 院中可真熱鬧木蹬,春花似錦、人聲如沸若皱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽走触。三九已至晦譬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間互广,已是汗流浹背敛腌。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惫皱,地道東北人像樊。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像旅敷,于是被迫代替她去往敵國和親生棍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容