c++别让异常逃离析构函数
C++并不禁止析構(gòu)函數(shù)吐出異常,但是并不鼓勵(lì)這樣做
- 1)原因
- 2)如何解決
1)原因
如果析構(gòu)函數(shù)吐出異常,程序可能過(guò)早結(jié)束(比如某個(gè)函數(shù)調(diào)用發(fā)生異常,在回溯尋找catch過(guò)程中,每離開(kāi)一個(gè)函數(shù),這個(gè)函數(shù)內(nèi)的局部對(duì)象會(huì)被析構(gòu),如果此時(shí)析構(gòu)函數(shù)又拋出異常,前一個(gè)異常還沒(méi)得到處理又來(lái)一個(gè),因此一般會(huì)引起程序過(guò)早結(jié)束)。異常從析構(gòu)函數(shù)中傳播出去,可能會(huì)導(dǎo)致不明確的行為
知乎相關(guān)描述
2)如何解決
1.在析構(gòu)函數(shù)中catch異常,然后調(diào)用abort終止程序。通過(guò)abort搶先置“不明確行為”于死地
2.在析構(gòu)函數(shù)中catch異常,然后記錄該失敗,即吞掉異常(通常是個(gè)壞主意,因?yàn)檫@樣壓制了“某些動(dòng)作失敗”的重要信息。但是也比負(fù)擔(dān)“草率結(jié)束程序”或”不明確行為帶來(lái)的風(fēng)險(xiǎn)“好)
3.重新設(shè)計(jì)接口,讓客戶能夠在析構(gòu)前主動(dòng)調(diào)用可能引起異常的函數(shù),然后析構(gòu)函數(shù)中使用一個(gè)bool變量,根據(jù)用戶是否主動(dòng)調(diào)用來(lái)決定析構(gòu)函數(shù)中是否應(yīng)該調(diào)用可能引起異常的函數(shù),讓客戶擁有主動(dòng)權(quán)(如果客戶沒(méi)有主動(dòng)調(diào)用,那么當(dāng)發(fā)生異常時(shí)也不應(yīng)該抱怨,因?yàn)橐呀?jīng)給出了客戶自己處理異常的機(jī)會(huì))
總結(jié)
以上是生活随笔為你收集整理的c++别让异常逃离析构函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 年底离职用什么来留住我的员工 方法很多以
- 下一篇: C++确定对象被使用前已先被初始化