C 異常處理機制核心觀點

2021-04-13 03:09:10 字數 3693 閱讀 2462

c++異常處理機制核心觀點:

0.如果使用普通的處理方式:assert,return等已經

足夠簡潔明瞭,請不要使用異常處理機制.

1.比c的setjump,longjump優秀.

2.可以處理任意型別的異常.

你可以人為地丟擲任何型別的物件作為異常.

throw 100;

throw "hello";

...3.需要一定的開銷,頻繁執行的關鍵**段避免使用

c++異常處理機制.

4.其強大的能力表現在:

a.把可能出現異常的**和異常處理**隔離開,結構更清晰.

b.把內層錯誤的處理直接轉移到適當的外層來處理,化簡了處理

流程.傳統的手段是通過一層層返回錯誤碼把錯誤處理轉移到

上層,上層再轉移到上上層,當層數過多時將需要非常多的判斷,

以採取適當的策略.

c.區域性出現異常時,在執行處理**之前,會執行堆疊回退,即為

所有區域性物件呼叫析構函式,保證區域性物件行為良好.

d.可以在出現異常時保證不產生記憶體洩漏.通過適當的try,catch

布局,可以保證delete pobj;一定被執行.

e.在出現異常時,能夠獲取異常的資訊,指出異常原因.

並可以給使用者優雅的提示.

f.可以在處理塊中嘗試錯誤恢復.保證程式幾乎不會崩潰.

通過適當處理,即使出現除0異常,記憶體訪問違例,也能

讓程式不崩潰,繼續執行,這種能力在某些情況下及其重要.

以上abcdef可以使你的程式更穩固,健壯,不過有時讓程式崩潰似乎更

容易找到原因,程式老是不崩潰,如果處理結果有問題,有時很難查詢.

5.並不是只適合於處理'災難性的'事件.普通的錯誤處理也可以用異常機制

來處理,不過如果將此濫用的話,可能造成程式結構混亂,

因為異常處理機制本質上是程式處理流程的轉移,不恰當的,過度的轉移顯然

將造成混亂.許多人認為應該只在'災難性的'事件上使用異常處理,以避免異常

處理機制本身帶來的開銷,你可以認為這句話通常是對的.

6.先讓程式更脆弱,再讓程式更堅強.首先,它使程式非常脆弱,稍有差錯,馬上

執行流程跳轉掉,去尋找相應的處理**,以求適當的解決方式.

很像乙個人身上帶著許多藥品,防護工具出行,稍有頭暈,馬上拿出清涼油;

遇到蚊子立刻拿出電蚊拍滅之.

windows:

7.將結構化異常處理結合/轉換到c++異常物件,可以更好地處理windows程式

出現的異常.

8.盡一切可能使用try,catch,而不是win32本身的結構化異常處理或者

mfc中的try,catch巨集.

用得恰到好處,方顯c++異常之美妙!catch(…)

這三個點並不是說要省略什麼.相反,你需要在程式中實際輸入這三個點.這是乙個很好的預設catch塊,應該把它放在其他所有catch塊之後.

17.1.7異常規範:

double safe_divide(int top,int bottom) throw(dividebyzero);

假如在函式中丟擲乙個異常,但異常規範中並未列出這個異常(也沒有在函式內部捕捉),會發生什麼事情?在這種情況下,程式會終止.尤其要注意的是,假如乙個異常在函式中招聘但既沒有在異常規範中列出,也沒有在函式內部捕捉,那麼它不會被任何catch塊捕捉,而是直接導致程式終止.記住,如果完全沒有異常規範列表,就連空白的都沒有,那麼效果等同於在規範列表中列出所有異常.在這種情況下,丟擲乙個異常不會終止程式.

注意,異常規範是為那些準備跑到函式外部的異常而準備的.如果它們不跑到函式外部,就不歸入異常規範.如果它們要跑到函式外部,就應該歸入異常規範,無論它們起源於何處.如果在函式定義內部的乙個try塊中丟擲乙個異常,而且在函式定義內部的乙個catch塊中捕捉這個異常這個異常的型別就不需要在異常規範中列出.如果函式定義包括對另乙個函式的呼叫,而另乙個函式可能招聘乙個它自已不會**捉的異常就應該在異常規範中列出異常的型別.

要表示乙個函式不應丟擲任何不在函式內部捕捉的異常,需要使用乙個空白異常規範.

void some_function() throw();

幾種方式可以總結如下:

void some_funtion() throw(dividebyzero,otherexecption);

//dividebyzero或otherexception型別的異常會被正常處理.

//至於其他任何異常,如果丟擲後未在函式主體中捕捉,就會終止程式.

void some_function()throw();

//空異常列表:一旦丟擲任何未在函式主體中捕捉的異常就會終止程式.

void some_function();

//正常處理所有型別的所有異常.

17.1.8陷阱:派生類中的異常規範

在派生類中重定義或覆蓋乙個函式定義時,它應具有與基類中一親友的異常規範,或至少應該在新的異常規範中給出基類異常規範的乙個子集.換言之,重定義或覆蓋乙個函式定義時,不可在異常規範中新增新異常.但是,如果願意,可刪減基類中原有的異常.之所以有這個要求,是因為在能夠使用基類物件的任何地方,都能使用乙個派生類物件.因此,重定義或覆蓋的函式必須相容於為基類物件編寫的任何**.

下面的內容是我從<>找到值得學習的內容

assert語句

我們曾用以下語句測試乙個名為in_stream的檔案是否成功開啟:

if(in_stream.fail())

可用assert(斷言)語句編寫同樣的測試,如下所示:

assert(!in_stream.fail());

注意,這種情況下,我們要插入乙個求反操作符(!),才能獲得同樣的效果,因為我們要斷言的是檔案開啟操作」沒有失敗」.

assert語句由識別符號assert,乙個邏輯表示式(包含在一對圓括號內)各乙個分號構成.可以使用任何邏輯表示式.如果邏輯表示式false,程式就終止執行,並給出乙個錯誤訊息.如果邏輯表示式示值為true,就什麼情況都不會發生,程式繼續執行assert語句之後的下一條語句.因此,assert 語句是在程式中進行錯誤檢查的一種精簡方式.

assert語句在cassert庫中定義,所以使用assert語句的任何程式都必須包含以下include預編譯指令:

#include

assert是乙個巨集(類似於函式的一種結構),所以有必要在乙個庫中定義它.

使用assert語句的乙個好處是可以將其關閉.你可在自己的程式中用assert語句來高度程式,再將其關閉使使用者看不到他們無法理解的錯誤訊息.關閉assert語句,還能減少程式執行這些語句的開銷.要關閉程式中的所有assert語句,請在include預編譯指令之前新增#define ndebug,如下所示:

#define ndebug

#include

因此,如果在進行了全面高度的程式中插入#define ndebug

,就會關閉程式中的所有assert語句.如果以後改動了程式,可刪除程式中的#define ndebug重新開啟assert語句第6點補充為:

6.先讓程式更脆弱,再讓程式更堅強.首先,它使程式非常脆弱,稍有差錯,馬上執行流程跳轉掉,去尋找相應的處理**,以求適當的解決方式,如果找不到任何解決辦法(異常沒有**獲並處理),立刻(結束程式執行).

很像乙個人身上帶著許多藥品,防護工具出行,稍有頭暈,馬上拿出清涼油;遇到蚊子立刻拿出電蚊拍滅之,遇到哪怕是蚊蟲叮咬,如果找不到電蚊拍,他馬上自殺!(這個傢伙真是脆弱:) 以致於我們必須為他準備所有的防護工具一旦我們為他準備了全部適當的防護工具,他就變成乙個非常堅強的人了!).

當然,代價是這個傢伙變得比較笨重,行動遲緩,

c 異常處理機制

c 異常處理機制 c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到...

c 異常處理機制

c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異...

C 異常處理機制

c 異常處理機制主要使用try,throw,catch三大關鍵字。try catch語句形式如下 require redcarpet markdown redcarpet.new hello world puts markdown.to htmltry catch exception1 ex 捕獲型...