C 中的throw和exception簡述

2021-08-16 03:23:09 字數 2021 閱讀 7159

throw 是c++中的關鍵字,用來丟擲異常。如果不使用 throw 關鍵字,try 就什麼也捕獲不到;上節提到的 at() 函式在內部也使用了 throw 關鍵字來丟擲異常。

throw 既可以用在標準庫中,也可以用在自定義的函式中,丟擲我們期望的異常。throw 關鍵字語法為:

throw exceptiondata;

exceptiondata 是「異常資料」的意思,它既可以是乙個普通變數,也可以是乙個物件,只要能在 catch 中匹配就可以。

下面的例子演示了如何使用 throw 關鍵字:

#include #include using namespace std;

char get_char(const string &, int);

int main()

執行結果:

pindex overflow!

在 get_char() 函式中,我們使用了 throw 關鍵字,如果下標越界,就會丟擲乙個 int 型別的異常:如果是下溢,異常資料的值為 1;如果是上溢,異常資料的值為 2。在 catch 中,將捕獲 int 型別的異常,然後根據異常資料輸出不同的提示語。

throw 關鍵字除了可以用在函式體中丟擲異常,還可以用在函式頭和函式體之間,指明函式能夠丟擲的異常型別。有些文件中稱為異常列表。例如:

double func (char param) throw (int);
這條語句宣告了乙個名為 func 的函式,它的返回值型別為 double,有乙個 char 型別的引數,並且只能丟擲 int 型別的異常。如果丟擲其他型別的異常,try 將無法捕獲,只能終止程式。

如果希望能夠丟擲多種型別的異常,可以用逗號隔開:

double func (char param) throw (int, char, exception);
如果不希望限制異常型別,那麼可以省略:

double func (char param) throw ();
如此,func() 函式可以丟擲任何型別的異常,try 都能捕獲到。

更改上例中的**:

#include #include using namespace std;

char get_char(const string &, int) throw(char, exception);

int main()

在使用 gcc 的 ide 中執行**,執行到第 12 行時程式會崩潰。雖然 func 函式檢測到下標越界,知道發生了異常,但是由於 throw 限制了函式只能丟擲 char、exception 型別的異常,所以 try 將捕獲不到異常,只能交給系統處理,終止程式。

需要說明的是,c++標準已經不建議這樣使用 throw 關鍵字了,因為各個編譯器對 throw 的支援不同,有的直接忽略,不接受 throw 的限制,有的將 throw 作為函式簽名,導致引用函式時可能會有問題。上面的**在 gcc 下執行時會崩潰,在 vs 下執行時則直接忽略 throw 關鍵字對異常型別的限制,try 可以正常捕獲到 get_char() 丟擲的異常,程式並不會崩潰。

標頭檔案:

#include

c++ 可以把它用作其它異常類的基類。

**可以引發exception異常,也可以把exception用作基類,

在從exception派生而來的類中重新定義乙個名為what()的虛擬成員函式,

它返回乙個字串,該字串隨實現而異。

#include class bad_hmean : public std::exception  

// ...

};

class bad_gmean : public std::exception

// ...

};

如果不想以不同的方式捕獲這些派生來的異常,可以在同乙個基類處理程式中捕獲它們:

try  

catch(std::exception& e)

否則,應分別捕獲它們。

java異常處理中throw和throws的區別?

throw和throws的區別主要有兩點!1 throw 後面跟的是物件,throws後面跟的是異常類 2 throw 定義函式體的內部,throws定義在函式名後。丟擲異常物件的型別 class demo 自定義異常要繼承exception 類 class myexception extends ...

Java中處理異常throw和throws

throw關鍵字 語句丟擲異常 throws關鍵字 宣告異常 方法丟擲乙個異常 01.throw 是語句丟擲乙個異常。語法 throw 異常物件 throw e 02.throws 是方法可能丟擲異常的宣告。用在宣告方法時,表示該方法可能要丟擲異常 呼叫者必須做出處理 捕獲或繼續丟擲 語法 修飾符 ...

SQL中EXCEPT和Not in的區別?

except會去重複,not in 不會 除非你在select中顯式指定 except用於比較的列是所有列,除非寫子查詢限制列,not in 沒有這種情況 表tb2中如果有null值的話,not in查詢得不到值 如 a b 表tb1中如果有null值,not in不會查詢出這個null值 如 d ...