C 異常處理

2021-09-25 00:25:20 字數 2786 閱讀 2455

c++的異常機制為程式設計師提供了一種可以更加自然處理異常的方法。

好處:使用異常可以使錯誤和處理分開來,由庫函式丟擲異常,由呼叫者捕獲並處理異常,是否終止異常就由呼叫者決定。

異常的處理結構

try

catch(errortype error)

catch(...)

丟擲異常

使用throw 異常物件語句

兩個含義:

沿著呼叫鏈的函式將提早退出,類似於return語句。

一旦程式開始執行異常處理**,沿著呼叫鏈建立的物件(區域性物件,**對於動態分配的變數將不會銷毀)將被銷毀。

棧展開:棧展開過程沿著潛逃函式的呼叫鏈不斷查詢,知道找到與異常相匹配的catch字句為止或未找到catch子句,則退出主函式。

重新丟擲異常

當捕獲了乙個異常,當當前無法處理時,我們可以先處理此時可以完成的處理,然後再次呼叫throw;丟擲異常。

當catch異常宣告語句是引用,在catch子句中對異常物件修改的內容才能被保留並繼續傳播

catch(error &err)
異常物件

throw語句中的表達物件必須是完全型別的。

如果語句是類型別的,則必須包含乙個可訪問的析構函式和乙個可訪問的拷貝建構函式或移動建構函式。

如果語句時陣列型別或函式型別,則表示式將被轉換成與之對應的指標型別,注意:丟擲乙個區域性物件的指標是錯誤的

當丟擲了一條表示式時,該表示式的靜態編譯型別決定了異常物件的型別。

捕獲異常

catch語句的異常宣告類似於函式的宣告

可以忽略捕獲形參的名字

宣告的型別必須是完全型別,可以是引用,指標,還可以加上const

異常的匹配規則比正常的轉換規則相比,受到了更多限制

必須正確處理捕獲異常的順序,派生類的catch子句應該位於基類的catch子句之前。

如果未捕獲異常,將會呼叫函式std::terminate(),預設情況時呼叫abort,可以呼叫set_terminate()來設定終止函式,引數是乙個函式指標,型別是:void (*terminate)()。

trycatch(b b)
a和b時相同的型別。

b是a的直接或間接基類,此時b會丟失a的部分資訊。

a,b是指標或引用,與普通型別的引用和指標規則一致。

函式丟擲異常的描述(c++11已經取消該方案)

可以將可能丟擲的異常集合作為函式宣告和定義的一部分,如果函式違反了這個規定,將會轉換為乙個std::unexpected()呼叫,預設是呼叫std::terminate(),通常 是呼叫abort()

int a();//表示可以丟擲任何異常

int b() throw();//表示不會丟擲任何異常

int c() throw(x1,x2);//表示會丟擲x1,x2型別以及其派生類型別的異常

示例
#include #include #include using namespace std;

class myerror

string what()

~myerror() throw(){}

private:

string error;

};void funcall()

int main()catch(myerror e){

cout<<"myerror e:";

cout<

throw和throw new的區別

throw exception()表示編譯器會自動建立乙個一場物件,並且由編譯器負責清理物件所佔記憶體

throw new exception()表示丟擲乙個由使用者建立的異常物件的指標,並且在catch子句中宣告為exception *,需要由使用者自己處理異常物件的記憶體。

建議使用throw exception()

析構函式中不能丟擲異常

如果析構函式丟擲異常,則異常點之後的程式不會執行,如果析構函式在異常點之後執行了某些必要的動作比如釋放某些資源,則這些動作不會執行,會造成諸如資源洩漏的問題。

通常異常發生時,c++的機制會呼叫已經構造物件的析構函式來釋放資源,此時若析構函式本身也丟擲異常,則前乙個異常尚未處理,又有新的異常,會造成程式崩潰的問題。

析構函式的異常不能被丟擲析構函式之外,需要在析構函式內部進行處理。

throw丟擲的物件

如果throw丟擲乙個物件,那麼無論catch中用什麼型別接收(引用或其他),在傳遞到catch之前都會構造乙個臨時物件,也就是說至少經歷了一次物件的複製,因此要求異常型別必須可複製的,並且該臨時物件的型別與異常物件的靜態型別是一致的,也就是說,如果throw丟擲的是乙個指向子類物件的父類引用,那麼會發生分割現象,即只有子類物件中的父類部分會被丟擲,丟擲物件的型別也是父類型別。

C 異常處理

結構化異常 structured exception vs c 異常 c exception 大家都知道c 異常是c 語言的乙個特性,使用者可以使用throw的方式來丟擲異常,try catch 來捕獲異常。結構化異常是諸如,zero divided,access violations等異常,這些異...

c 異常處理

一 概述 c 自身有著非常強的糾錯能力,發展到如今,已經建立了比較完善的異常處理機制。c 的異常情況無非兩種,一種是語法錯誤,即程式中出現了錯誤的語句,函式,結構和類,致使編譯程式無法進行。另一種是執行時發生的錯誤,一般與演算法有關。關於語法錯誤,不必多說,寫 時心細一點就可以解決。c 編譯器的報錯...

C 異常處理

程式設計師常常忽視異常處理的重要性,這給他們自己的 造成相當大損害。本文將討論如何在c 中使用異常處理,並介紹在應用 中新增 片段以防止某些錯誤的一些簡單方法,這些錯誤可能導致程式異常終止。結構化異常處理 net框架提供一種標準的錯誤報告機制稱為結構化異常處理。這種機制依賴於應用中報告錯誤的異常。在...