Cpp 異常處理

2021-07-10 05:21:51 字數 2270 閱讀 4929

1.程式不可能不出錯

2.傳統的錯誤處理機制存在缺陷

1)通過返回值表示錯誤

缺點:錯誤處理流程比較複雜,逐層判斷,**臃腫。

優點:函式呼叫路徑中所有的區域性物件(棧物件)都能被右花括號正確地析構,不會記憶體洩漏。

2)通過遠端跳轉處理錯誤

優點:不需要逐層判斷,一步到位處理錯誤,**精煉。

缺點:函式呼叫路徑中的區域性物件失去被析構機會,形成記憶體洩漏。

3.c++的異常結合兩種傳統錯誤處理的優點,同時規避了它們的預設,既可以在形式上實現一步到位的錯誤處理,無需逐層判斷返回值,同時又能保證所有區域性物件得到正確的析構。

1.異常丟擲:throw 異常物件;

1)可以丟擲基本型別的物件

throw -1;

throw

"開啟檔案失敗!";

2)可以丟擲類型別的物件

fileexception ex ("開啟檔案失敗!");

throw ex;

throw fileexception ("開啟檔案失敗!");

3)不要丟擲區域性物件的指標

fileexception ex ("開啟檔案失敗!");

throw &ex; // 不要!

2.異常捕獲:

try 

catch (異常型別1& ex)

catch (異常型別2& ex)

...catch (...)

3.catch子句根據異常物件的型別自上至下順序匹配,而非最優匹配,因此對子類型別異常的捕獲不要放在對基類型別異常的捕獲後面,否則前者將被後者提前截獲。

4.建議在catch子句中使用引用接收異常物件,避免拷貝構造的效能開銷,同時可以減少引發新異常的風險。

5.可以被throw子句丟擲的物件型別,必須支援深拷貝,否則所丟擲異常物件將和安全區中的副本形成記憶體耦合,可能在後續操作中引發未定義的後果。

1.無論是全域性函式還是類的成員函式,可以在其原型中增加異常說明,意在說明該函式所可能丟擲的異常型別。

返回型別 函式名 (形參表) [const] throw (異常型別表)

void foo (string const& file, string const& size, int x, int y)

throw (fileexception, memoryexception,

divbyzeroexception)

2.函式的異常說明是一種承諾,即表示該函式所丟擲異常不會超出所說明的範圍。如果該函式真的丟擲了異常說明以外的異常型別,該異常無法被此函式的呼叫者所捕獲,而是繼續向上層丟擲,直至被系統捕獲,中止程序。

3.函式異常說明的兩種極端形式

1)不寫異常說明,表示可以丟擲任何異常;

2)空異常說明,throw (),表示不會丟擲任何異常。

4.如果函式的宣告和定義分開書寫,一定要保證其異常說明嚴格一致,但異常型別的順序無所謂。

5.如果基類中的虛函式帶有異常說明,那麼該函式在子類中的覆蓋版本不能說明比基類版本丟擲更多的異常,否則將因為放鬆throw限定而導致編譯失敗。

1.建構函式可以丟擲異常,而且某些情況下還必須丟擲異常。建構函式丟擲異常,物件將會被不完整構造,這樣的物件其析構函式永遠不會被執行。因此在建構函式丟擲異常之前,就需要手動銷毀所有在異常產生之前動態分配的資源,除非使用了智慧型指標(auto_ptr)。

2.析構函式最好不要丟擲異常

class a 

}try

catch (exception& ex)

在兩種情況下,類的析構函式會被呼叫:

1)正常銷毀物件,離開作用域或顯式delete;

2)在異常傳遞的堆疊輾轉開解過程中,由異常處理系統負責銷毀物件;

對於第二種情況,異常正處於啟用狀態,而析構函式又丟擲了異常,並試圖將流程轉移至析構函式之外,這時c++將通過std::terminate()函式,令程序終止,以防止因為堆疊輾轉開解過程的無限遞迴導致棧空間溢位。

void foo (void) 

class a

catch (...) {}

}};

在析構函式中,執行任何可能引發異常的操作,都盡量把異常在析構函式內部消化掉,防止其從析構函式中被繼續丟擲。

struts 異常處理 全域性異常處理

記錄一下全域性異常處理的過程 處理主動丟擲的異常,轉向錯誤提示頁面。1 寫乙個自己的異常,繼承runtimeexception,從父類生成構造方法 package me.yndy.srtp.exception suppresswarnings serial public class errorexc...

python異常處理 Python 異常處理

使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...

01 異常 異常處理

注意 1 對定義的變數能初始化的盡量初始化,如果賦的值可能產生誤導,可以採用可空型別 例如 double?dnumres null 3 異常 執行的時候出現的錯誤,或bug 編寫 的預期條件玉實際條件不穩合 異常的機制是為了保證程式可以一直正常執行。丟擲異常 throw new exception ...