問題:
如何判斷乙個函式是否會丟擲異常,以及丟擲哪些異常?
假設在開發的時候,呼叫乙個函式來完成某項任務,這個函式不是你寫的或者是第3庫中的乙個函式,那麼問題來了,你如何確定這個函式會不會丟擲異常呢?
為什麼要搞清這個問題,因為我們學習了異常處理,那麼我們在呼叫乙個函式的時候,就必須考慮這個函式會不會丟擲異常,如果會,又丟擲什麼異常?
看一下函式實現,貌似可以。但如果這個函式是第三方庫實現的,只有函式的宣告,沒有函式的實現,你又怎麼辦?
可以檢視文件,檢視文件確實是乙個不錯的方法。但手頭的文件和庫的版本不匹配,就有可能查到的東西是不準確的。
c++提供語法用於宣告函式所丟擲的異常
異常宣告作為函式宣告的修飾符,寫在引數列表後面
//可能丟擲任何異常
void func1();
//只能丟擲異常型別:char和int
void func2() throw(char,int);
//不丟擲任何異常
void func3() throw();
異常規格說明的意義
提示函式呼叫者必須做好異常處理的準備
提示函式的維護者不要丟擲其他異常
異常規格說明是函式介面的一部分
問題:如果丟擲的異常不在宣告列表中,會發生什麼?
下面的**輸出什麼?
#include using利用qt中的c++編譯器:namespace
std;
void func() throw(int) //
拋int型別的異常
intmain()
catch(int
)
catch(char
)
return0;
}
從列印結果看,terminate函式被呼叫了。根據上篇部落格中的介紹,terminate函式之所以被呼叫是因為在main函式中無法處理異常。但是在該程式中,在main函式中,有處理異常的語句catch(char)。為什麼沒有列印catch(char)?
利用visual studio 2010編譯器進行編譯的時候,會列印catch(char)。
從上面可以看出編譯器的行為是不同的
函式丟擲的異常不在規格說明中,全域性unexpected()被呼叫
預設的unexpected()函式會呼叫全域性的terminate()函式
可以自定義函式替換預設的unexpected()函式實現
注意:不是所有的c++編譯器都支援這個標準行為
自定義unexpected()函式
#include #include#include
using
namespace
std;
void
my_unexpected()
void func() throw(int) //
拋int型別的異常
從列印結果可以看出,在func函式中丟擲的異常不在規格說明中,全域性unexpected()被呼叫。
#include #include#include
using
namespace
std;
void
my_unexpected()
void func() throw(int) //
拋int型別的異常
分析:呼叫func函式時,丟擲的異常不在規格說明中,因此自定義的my_unexpected函式將被呼叫。在該函式中又丟擲了異常,該異常在func規格說明中,
此時異常符合觸發函式的異常規格說明,因此恢復程式執行。相當於呼叫func時,扔出的就是乙個int型別的異常。因此列印了catch(int)。
如果是用visual studio,還是列印出catch(char),仍然我行我素。
因此,在使用異常規格說明時,首先編寫乙個小程式來測試一下編譯器的行為。
71 函式的異常規格說明
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 9.2.0 一 函式的異常規格說明 1 問題 如何判斷乙個函式是否會丟擲異常,以及丟擲哪些異常?1 給函式宣告丟擲異常 2 檢視文件 2 c 提供語法用於宣告函式所丟擲的異常 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...