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