C++異常處理機制核心觀點總結

linlinlinxi007發表於2010-01-28

潛心研究C++異常處理機制數日,有所得,與大家共享:

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++異常之美妙!

相關文章