effective c 關於異常安全

2021-08-10 05:41:57 字數 1085 閱讀 5166

假設有個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這個異常。在...