這篇也就是在析構函式裡處理潛在風險的處理辦法。
如果乙個類在析構的時候出錯,那麼程式可能馬上結束或者發生不明確行為。為了不讓異常被傳遞出去就應該在析構中解決掉。
難道是析構函式內丟擲異常不會報錯嗎???
不是。很幸運,現在的編譯器是不會放過析構函式中丟擲的異常的。注意一般不要析構中丟擲異常就行了。
但是如果不確定是否會丟擲異常的話,或者說還是無法避免需要判斷是否丟擲了異常!!!
比如如果我擔心下面這個例項物件a的close()方法出錯拋了異常,我就應該採用兩種方法解決。加了std::abort()是強行終止程式,不加是「吞下去」。
b::~b()
catch(...)
}
如果需要對「導致close()丟擲異常」的情況作出反應,可以給類b乙個介面,來由客戶自己設計出錯後應該作出的行動。
其實就是避免析構函式內的函式close()出錯,所以提前close
#include#includeusing namespace std;
class a
};class b
~b()
//catch (...)
} cout << "~b ended" << endl;
}};void main(void)
b內方法close()的作用是,避免異常在析構函式裡被丟擲。
這樣的做法還是不好!!
還是避免析構函式內丟擲異常把,可能記憶體歸還的寫在別的方法裡比較好!
參考:《effective c++》
C 異常以及異常與析構函式
1.丟擲異常 1.1 丟擲異常 也稱為拋棄異常 即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。該語句的格式為 throw 表示式 如果在try語句塊的程式段中 包括在其中呼叫的函式 發現了異常,且拋棄了該異常,則這個異常就可以被try語句塊後的某個catc...
c 構造和析構異常
c 建構函式的異常是乙個比較難纏的問題,很多時候,我們可能不去考慮這些問題,如果被問到,有人可能會說使用raii管理資源。但你真的考慮過如果建構函式失敗了,到底會發生什麼嗎,前面構造成功的成員 基類物件應該怎樣 最近在知乎上看到有人提到這個問題 看了陳碩的回答,抱著懷疑的心態寫 加以驗證。在此之前,...
C 建構函式 析構函式與丟擲異常
問題 建構函式可以丟擲異常麼?析構函式可以嗎?分析 從語法上來說,建構函式和析構函式都可以丟擲異常。但從邏輯上和風險控制上,建構函式可以,析構函式不推薦丟擲異常。1 建構函式可以丟擲異常 無論何時,從建構函式中丟擲異常都是可以的。動態建立物件要進行兩個操作 分配記憶體和呼叫建構函式。若在分配記憶體時...