函式的異常規格說明

2022-06-21 06:06:11 字數 2504 閱讀 8235

問題:

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

假設在開發的時候,呼叫乙個函式來完成某項任務,這個函式不是你寫的或者是第3庫中的乙個函式,那麼問題來了,你如何確定這個函式會不會丟擲異常呢?

為什麼要搞清這個問題,因為我們學習了異常處理,那麼我們在呼叫乙個函式的時候,就必須考慮這個函式會不會丟擲異常,如果會,又丟擲什麼異常?

看一下函式實現,貌似可以。但如果這個函式是第三方庫實現的,只有函式的宣告,沒有函式的實現,你又怎麼辦?

可以檢視文件,檢視文件確實是乙個不錯的方法。但手頭的文件和庫的版本不匹配,就有可能查到的東西是不準確的。

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

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

//可能丟擲任何異常

void func1();

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

void func2() throw(char,int);

//不丟擲任何異常

void func3() throw();

異常規格說明的意義

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

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

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

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

下面的**輸出什麼?

#include using

namespace

std;

void func() throw(int) //

拋int型別的異常

intmain()

catch(int

)

catch(char

)

return0;

}

利用qt中的c++編譯器:

從列印結果看,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...