異常處理(三 C 語言異常處理)

2021-04-02 02:12:47 字數 2861 閱讀 7706

1 c++異常處理語法

c++語言的後期改造者們,他們在標準c++語言中專門整合了異常處理的相關語法(與之不同的是,所有的c 標準庫異常體系都需要執行庫的支援,它不是語言核心支援的)。當然,異常處理被加到程式語言中,也是程式語言發展和逐步完善的必然結果。我們看到,c++不是唯一整合異常處理的語言。

c++的異常處理結構為:

code:try

catch(type_1 e)

catch(type_2 e)

catch (...)//會捕獲所有未**獲的異常,必須最後出現

而異常的丟擲方式為使用throw(type e),try、catch和throw都是c++為處理異常而新增的關鍵字。看看這個例子:
code:#include

//定義point結構體(類)

typedef struct tagpoint

point;

//扔出int異常的函式

static void f(int n)

//扔出point異常的函式

static void f(point point)

int main()

catch (int e)

catch (point e)

return 0;

}

函式f定義了兩個版本:f(int)和f(point),分別丟擲int和point異常。當main函式的try中呼叫f(point)時和f(1)時,分別輸出:

捕獲到point異常:(0,0)

和捕獲到int異常:1

在c++中,throw丟擲異常的特點有:

(1)可以丟擲基本資料型別異常,如int和char等;

(2)可以丟擲複雜資料型別異常,如結構體(在c++中結構體也是類)和類;

(3)c++的異常處理必須由呼叫者主動檢查。一旦丟擲異常,而程式不捕獲的話,那麼abort()函式就會被呼叫,程式被終止;

(4)可以在函式頭後加throw([type-id-list])給出異常規格,宣告其能丟擲什麼型別的異常。type-id-list是乙個可選項,其中包括了乙個或多個型別的名字,它們之間以逗號分隔。如果函式沒有異常規格指定,則可以丟擲任意型別的異常。

2 標準異常

下面給出了c++提供的一些標準異常:

code:namespace std

請注意觀察上述類的層次結構,可以看出,標準異常都派生自乙個公共的基類exception。基類包含必要的多型性函式提供異常描述,可以被過載。下面是exception類的原型:
code:class exception

;

其中的乙個重要函式為what(),它返回乙個表示異常的字串指標。下面我們從exception類派生乙個自己的類:
code:#include

#include

using namespace std;

class myexception:public exception

};

int main()

catch (exception &r) //捕獲異常

return 0;

}

程式執行,輸出:

捕獲到異常:乙個過載exception的例子

一般的,我們直接以基類捕獲異常,例如,本例中使用了

code:catch (exception &r)

然後根據基類的多型性進行處理,這是因為基類中的what函式是虛函式。

3 異常處理函式

在標準c++中,還定義了數個異常處理的相關函式和型別(包含在標頭檔案

中):

code:namespace std

其中的terminate相關函式與未**獲的異常有關,如果一種異常沒有被指定catch模組,則將導致terminate()函式被呼叫,terminate()函式中會呼叫ahort()函式來終止程式。可以通過set_terminate(terminate_handler)函式為terminate()專門指定要呼叫的函式,例如:
code:#include

#include

using namespace std;

//定義point結構體(類)

typedef struct tagpoint

point;

//扔出point異常的函式

static void f()

//set_terminate將指定的函式

void terminatefunc()

int main()

catch (int) //捕獲int異常

//point將不能**獲到,引發terminatefunc函式被執行

return 0;

}

這個程式將在控制台上輸出 "set_terminate指定的函式" 字串,因為point型別的異常沒有**獲到。當然,它也會彈出對話方塊(因為呼叫了abort()函式)。

上述給出的僅僅是乙個set_terminate指定函式的例子。在實際工程中,往往使用set_terminate指定的函式進行一些清除性的工作,其後再呼叫exit(int)函式終止程式。這樣,abort()函式就不會被呼叫了,也不會輸出圖1所示對話方塊。

關於標準c++的異常處理,還包含一些比較複雜的技巧和內容,學員可以查閱《more effective c++》的條款9~條款15。

異常處理(二 C語言的異常處理)

1 異常終止 標準c庫提供了abort 和exit 兩個函式,它們可以強行終止程式的執行,其宣告處於 標頭檔案中。這兩個函式本身不能檢測異常,但在c程式發生異常後經常使用這兩個函式進行程式終止。下面的這個例子描述了exit 的行為 code include include int main void...

的異常處理 C 異常處理總結

做開發不僅僅要考慮到業務邏輯更要在寫 時將各種可能考慮周全,但是這又是很難的事情,畢竟開發就是個人的事,而使用者可能上萬甚至百萬級別。這時,程式的穩定性就極為重要,我們不能讓程式因為某一處執行出問題而就直接導致程式或者產生其他更嚴重的後果,比如 做除法時當除數為零時,陣列訪問越界時,容器capaci...

C 異常處理

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