別讓異常逃離析構函式

2021-09-24 10:40:10 字數 1456 閱讀 8586

c++中並不禁止析構函式吐出異常,但是並鼓勵這樣做,看下面**:

當vector v被銷毀時,它有責任將其中所有的widgets銷毀並且**記憶體,而在析構第乙個元素時候,析構函式會丟擲異常,但是第二個vector的時候也會丟擲異常,這對於c++來說太多了。這會導致程式不明確的行為。c++不喜歡析構函式吐出異常。

其中乙個合理的解法是建立乙個用來管理的dbconnecton資源的class,並在析構函式中呼叫close。如下:

那麼下面**:

只要呼叫close成功,就可以,但是如果該呼叫導致異常,dbconn析構函式就會傳播異常,導致其離開析構函式,會出問題,丟擲難以駕馭的問題。

怎麼避免這個問題?dbconn的析構函式可以:

方法一:

這個方法可以阻止異常從析構函式傳播出去,不產生不明確的行為。abort可以搶先制不明確行為於死地。

方法二:

以上的方法可行,但是都沒有對丟擲的異常而做出相應的反應。

那麼我們可以從新來從新設計dbconn的介面:

不讓析構函式來丟擲異常,讓使用者自己用時間來處理自己丟擲的異常,從而達到不會因為析構函式丟擲異常而導致出現不明的行為。

總結:析構函式絕對不要吐出異常,如果乙個析構函式呼叫,呼叫函式可能丟擲異常的話,析構函式應該撲捉任何的異常,然後吞下他們(不傳播),或者結束程式。

如果客戶要對某個操作函式執行期間的異常作出反應,那麼class應該提供了另乙個普通的函式(而非在析構函式中)執行該操作。(該異常反正就是一句話,不能在析構函式中呼叫可能出現異常的函式,因為析構函式有可能多次被呼叫,那麼丟擲異常可能會出現不可以預知的結果,多以如果你想處理該異常的話,就應該自己定義乙個普通的函式來處理該異常,就是自己來寫乙個介面,讓使用者自己來控制就可以。)

發表於

2015-05-21 14:46

周某某 閱讀(

...)

編輯收藏

重新整理頁面

返回頂部

effective c 別讓異常逃離析構函式

c 並不禁止析構函式吐出異常,但是它不鼓勵這樣做 class widget vector vec 當vec被銷毀時,他有責任銷毀其內含的所有widget 如果vec內含10個widget,在析構第乙個元素期間,有個異常被丟擲,其他9個widget還是應該被銷毀,否則他們儲存的資源都會發生洩漏 當碰到...

effect C 別讓異常逃離析構函式

class widget void dosomething 當vector v被銷毀,它有責任銷毀內含的所有widgets。假設v內含十個widgets,而在析構第乙個元素期間,有個異常被丟擲。其他九個widgets還是應該被銷毀 否則它們儲存的任何資源都會發生洩露 因為v應該呼叫它們它們各個析構函...

條款08 別讓異常逃離析構函式

總結 1.在析構函式中盡量不要有丟擲異常的事情發生,如果析構函式中丟擲了異常,析構函式應該自己捕捉這個異常,然後根據程式需要終止程式或者吞下這個異常然繼續執行程式 2.如果需要客戶對於某個操作的函式執行期間所丟擲的異常做出反應,這個時候應該將這個丟擲異常的 函式單獨寫在乙個函式中,而不是在析構函式中...