假設有個class用來表現夾帶背景圖案的
gui選單,用於多執行緒,有個互斥器作為併發控制
class prettymenu;
void prettymenu::changebackground(std::istream& imgsrc)
帶有異常安全性的函式會:
1)不洩露任何資源 ,一旦
new image(imgsrc)
異常,對
unlock
的呼叫就不能執行,於是互斥器永遠被鎖住了。
2)不允許資料敗壞。如果
new image(imgsrc)
丟擲異常,
bgimage
就指向被刪除的物件,
imagechanges
也已被累加,其實新影象沒被成功安裝。
解決資源洩露很容易:
void prettymenu::changebackground(std::istream& imgsrc)
關於資料敗壞
異常安全函式提供三個保證之一:
1)基本承諾:如果異常丟擲,程式內任何事物保持在有效狀態
2)強烈保證:如果異常丟擲,程式狀態不變
3)不丟擲異常
class prettymenu;
void prettymenu::changebackground(std::istream& imgsrc)
這兩個改變幾乎足夠讓changebackground提供強烈的異常安全保證。如果
image
建構函式丟擲異常,有可能輸入流讀取記號已被移走,這樣的搬移對程式其餘部分是可見的狀態改變。
copy and swap
將隸屬物件的資料從源物件放進另乙個物件,然後賦予源物件乙個指標,指向所謂的實現物件,典型寫法如下:
struct pmimple;
class prettymenu;
void prettymenu::changebackground(std::istream& imgsrc)
effective c 別讓異常逃離析構函式
c 並不禁止析構函式吐出異常,但是它不鼓勵這樣做 class widget vector vec 當vec被銷毀時,他有責任銷毀其內含的所有widget 如果vec內含10個widget,在析構第乙個元素期間,有個異常被丟擲,其他9個widget還是應該被銷毀,否則他們儲存的資源都會發生洩漏 當碰到...
關於異常和異常捕獲。
異常即非正常狀態,主要包括書寫或語法上的錯誤導致直譯器無法正常執行。異常描述 importerror 匯入模組 物件失敗 indexerror 序列中沒有此索引 index keyerror 對映中沒有這個鍵 nameerror 未宣告 初始化物件 沒有屬性 syntaxerror python 語...
關於異常捕獲
你可以查一下你的sdk,裡面有很多的exception的定義,其基類其實都是system.exception一樣。但system.exception只提供了一些一般異常的處理。更多的需要專業的來處理。比如找不到檔案,你必須捕捉system.io.filenotfoundexception這個異常。在...