C 異常處理機制

2021-07-15 02:34:50 字數 2499 閱讀 2855

c++異常處理機制主要使用try,throw,catch三大關鍵字。 try-catch語句形式如下:

require

'redcarpet'

markdown = redcarpet.new("hello world!")

puts markdown.to_html

try

catch(exception1& ex) // 捕獲型別為exception1的異常

catch(exception2& ex) // 捕獲型別為exception2的異常

catch(...) // 三個點表示捕獲所有型別的異常

如果在try語句裡面發現了異常,並且丟擲了該異常,那麼該異常將按照順序與try語句塊後面的多個catch語句中異常的型別逐個匹配,若是型別相同則該異常將會被對應的catch語句捕獲,並且後續的catch語句也不會再執行判斷(乙個異常只能被乙個catch語句捕獲,除非該異常**獲後又被重新丟擲,這個後面會講到,這裡不考慮這種情況)。若所有的catch語句都無法捕獲該異常,那麼將會導致程式中止執行的情況。

那麼如何才能丟擲異常呢?答案很簡單,就是用:

throw 表示式;

//這裡的表示式其實就是某些異常型別的例項化物件

//可以是乙個內建變數(如int、float型別的變數),也可以是自己定義的或者標準庫中的異常類的物件

舉個例子,如果我想丟擲標準庫中的乙個runtime_error異常,可以這樣寫:

throw runtime_error("messages");

//這裡的「message"是初始化用的

下面舉個完整的例子來說明異常的處理:

#include 

#include //include standard exception classes

using

namespace

std;

int div(int num1, int num2)

int main()

這裡需要注意第一點是:如果輸入的num2是0,那麼div()函式將會丟擲異常,同時try語塊中共在int res = div(num1,num2);語句後面的**將會被直接跳過而不會被執行。第二點是catch語句用引用接受引數,這樣做的好處就是:不用拷貝引數,提高了傳參的效率,同時還可以利用多型性(可以在一定程度上處理更大範圍的異常型別)。

在上面提到,異常**獲之後可以被重新丟擲,之所以要這樣做的原因是:有可能單個catch不能完全處理乙個異常,此時在進行了一些處理工作之後,需要將異常重新丟擲,由函式呼叫鏈中更上層的函式來處理。重新丟擲的具體實現為throw;,throw後不跟表示式或型別。

這部分網上有人已做了總結,下同,引用如下:

為了加強程式的可讀性,使函式的使用者能夠方便地知道所使用的函式會丟擲哪些異常,可以在函式的宣告中列出這個函式可能丟擲的所有異常型別,例如:void fun() throw( a,b,c,d);這表明函式fun()可能並且只可能丟擲型別(a,b,c,d)及其子型別的異常。

如果在函式的宣告中沒有包括異常的介面宣告,則此函式可以丟擲任何型別的異常,例如:void fun();

乙個不會丟擲任何型別異常的函式可以進行如下形式的宣告:void fun() thow();

(1).一般在異常丟擲後資源可以正常被釋放,但注意如果在類的建構函式中丟擲異常,系統是不會呼叫它的析構函式的,處理方法是:如果在建構函式中要丟擲異常,則在丟擲前要記得刪除申請的資源。

(2). 異常處理僅僅通過型別而不是通過值來匹配的,所以catch塊的引數可以沒有引數名稱,只需要引數型別。

(3). 函式原型中的異常說明要與實現中的異常說明一致,否則容易引起異常衝突。

(4). 應該在throw語句後寫上異常物件時,throw先通過copy建構函式構造乙個新物件,再把該新物件傳遞給 catch語句.

那麼當異常丟擲後新物件如何釋放?異常處理機制保證:異常丟擲的新物件並非建立在函式棧上,而是建立在專用的異常棧上,因此它才可以跨接多個函式而傳遞到上層否則在棧清空的過程中就會被銷毀。所有從try到throw語句之間構造起來的物件的析構函式將被自動呼叫。但如果一直上溯到main函式後還沒有找到匹配的catch塊,那麼系統呼叫terminate()終止整個程式,這種情況下不能保證所有區域性物件會被正確地銷毀。

(5). 派生類的異常撲獲要放到父類異常撲獲的前面,否則,派生類的異常無法被撲獲。

(6).編寫異常說明時,要確保派生類成員函式的異常說明和基類成員函式的異常說明一致,即派生類改寫的虛函式的異常說明至少要和對應的基類虛函式的異常說明相同,甚至更加嚴格,更特殊。

注:與原文內容相比,有所調整

c 異常處理機制

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

c 異常處理機制

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

C 異常 處理機制

在c 的發展過程中,為了實際的需要,引入了異常處理機制。程式中常見的錯誤 語法錯誤和執行錯誤,語法錯誤一般都是在編譯時候發現的,編譯器基本上都會報出錯誤的具體位置,因此這類錯誤一般都是比較好修改,執行錯誤一般不容易進行除錯,比如說,程式崩潰 一般是由於棧溢位 執行結果錯誤 一般是演算法的邏輯結構有問...