[原創文章歡迎轉載,但請保留作者信息]
Justin 于 2009-11-04
在析構函數中不能拋出異常。
這個其實比較容易理解:異常不像函數調用,一旦拋出(throw),就回不來了。如果在析構函數中拋出了異常,有一部分釋放/摧毀對象成員的操作可能就無法進行。因為某個異常,導致了所在的析構函數無法完成全部析構任務。
一顆老鼠屎毀了一鍋湯啊……
可是要是真的需要對析構動作中出現的錯誤/異常進行處理咋辦?書中自有解決方案:從差的到好的。
-
在析構函數內布置catch,一旦發生異常就會被捕獲,然后簡單調用std::abort自殺@#¥%
點評:干脆是干脆了,但是這樣猝死會不會有點太突然? -
也是在函數內布置catch,但是遇到異常就把它直接吃到肚子里(大師語:Swallow the exception)。在析構函數外不會有人知道有什么不好的事發生,catch肚子里嘭的一聲響,它除了打了個嗝,沒有什么危險……
點評:一般不該這樣處理,畢竟發生了不好的事。但如果真的想要程序繼續帶傷上陣,也確定這樣不會有問題,那也不會有人有意見。 -
除了在函數里布置catch,并采用以上任一方法,另外實現一個可供用戶調用的函數接口,用來處理這些有可能出錯的析構工作。
點評:大師給予這個方案高度的評價,因為這樣不但有以上兩種方法的效果,還給用戶一個參與處理異常的機會(調用接口函數)。如果用戶沒有(或者忘記)用該函數處理析構的動作,那么析構函數也會自覺挑起這個任務。而這個時候如果還出問題,用戶也沒有什么理由來責怪了:是你自己不想要管的!