注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境: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...