71 函式的異常規格說明

2021-10-09 16:36:03 字數 2554 閱讀 8282

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:9.2.0

一、函式的異常規格說明

1)問題

如何判斷乙個函式是否會丟擲異常,以及丟擲哪些異常?

1、給函式宣告丟擲異常

2、檢視文件

2)c++提供語法用於宣告函式所丟擲的異常

3)異常宣告作為函式宣告的修飾符,寫在引數列表後面

/*可能丟擲任何異常*/

void func1();

/*只能丟擲的異常型別:char和int*/

void func2() throw(char,int);    //函式規格異常的說明

/*不丟擲任何異常*/

void func3() throw();

4)異常規格說明的意義

-    提示函式呼叫者必須做好異常處理的準備

-    提示函式的維護者不要丟擲其它異常

-    異常規格說明是函式介面的一部分

5)問題

如果丟擲的異常不在宣告列表中,會發生什麼?

6)下面的**輸出什麼?

catch(int)和catch(char)都沒有具體的識別符號(比如int a,少了a)

程式設計實驗

異常規格之外的異常

e2-1.cpp

#include using namespace std;

void func() throw(int)

int main()

catch(int)

catch(char)

return 0;

}

操作:

1)g++編譯,編譯正確。執行:

func()

terminate called after throwing an instance of 'char'

aborted (core dumped)

b++/vs2010/g++編譯器行為略有不同

如果函式丟擲的異常型別,不在異常型別規格說明中。

7)函式丟擲的異常不在規格說明中,全域性unexpected()被呼叫

8)預設的unexpected()函式會呼叫全域性的terminate()函式

9)可以自定義函式替換預設的unexpected()函式實現

10)注意:不是所有的c++編譯器都支援這個標準行為

使用異常規格說明前,自己編寫測試程式看看編譯器行為!

11)unexpected()函式的替換

-    自定義乙個無返回值無引數的函式

*能夠再次丟擲異常

當異常符合觸發函式的異常規格說明時,恢復程式執行

否則,呼叫全域性terminate()函式結束程式

-    呼叫set_unexpected()設定自定義的異常函式

*引數型別為void(*)()——函式指標

*返回值預設的unexpected()函式入口位址

程式設計實驗

自定義unexpected()函式

e2-2.cpp

#include #include #include using namespace std;

void my_unexpected()

void func() throw(int)

int main()

catch(int)

catch(char)

return 0;

}

操作:

1)g++編譯(注釋14行,使用exit(1))。列印結果:

func()

void my_unexpected()

不符合自己的異常處理函式,就呼叫了全域性異常處理函式。

b++和g++編譯器結果一樣,都遵循了c++標準規範!

vs2010不遵循!

2)g++編譯(注釋13行,丟擲異常)。列印結果:

func()

void my_unexpected()

catch(int)

func()丟擲異常'c',沒有對應的異常規格,呼叫了全域性的my_unexpected(),這裡丟擲異常

throw 1,為int型。int型異常相容了func()異常規格,然後呼叫了catch(int),列印

catch(int)

這個例子為了說明:使用前,要編寫小例子測試編譯器是否符合標準c++規範

小結1)c++中的函式可以宣告異常規格說明

2)異常規格說明可以看作介面的一部分

3)函式丟擲的異常不在規格說明中,unexpected()被呼叫

4)unexpected()中能夠再次丟擲異常

-    異常能夠匹配,恢復程式的執行

-    否則,呼叫terminate()結束程式

函式的異常規格說明

問題 如何判斷乙個函式是否會丟擲異常,以及丟擲哪些異常?假設在開發的時候,呼叫乙個函式來完成某項任務,這個函式不是你寫的或者是第3庫中的乙個函式,那麼問題來了,你如何確定這個函式會不會丟擲異常呢?為什麼要搞清這個問題,因為我們學習了異常處理,那麼我們在呼叫乙個函式的時候,就必須考慮這個函式會不會丟擲...

C 外傳篇 2 函式的異常規格說明

問題 如何判斷乙個函式是否會丟擲異常,以及丟擲哪些異常?可能丟擲任何異常 void func1 只能丟擲的異常型別 char 和 int void func2 throw char,int 不丟擲任何異常 void func3 throw 問題 如果丟擲的異常不在宣告列表中,會發生什麼?includ...

C 解析 外傳篇 2 函式的異常規格說明

1.異常規格說明 2.unexpected 函式 3.小結 問題 如何判斷乙個函式是否會丟擲異常,以及丟擲哪些異常?異常規格說明的意義 問題 如果丟擲的異常不在宣告列表中,會發生什麼?下面的 的輸出什麼?示例 異常規格之外的異常 include using namespace std void fu...