標準C 異常處理

2021-09-30 04:48:41 字數 2165 閱讀 9759

標準c++異常處理(eh)

eh引入了3個新的c++語言關鍵字:

catch、throw、try。

異常通常通過下列語句觸發

a.throw [expr] 函式通過「異常規格申明」定義它將丟擲什麼異常

b.throw ([type-id-list]) 可選項type-id-list包含乙個或多個型別的名字,以逗號分割。這些異常靠try塊中的異常處理函式進行捕獲。

try compound-statement handler-sequence

處理函式佇列包含乙個或多個處理函式,形式如下:

catch ( exception-declaration ) compound-statement

處理函式的「異常申明」指明了這個函式將捕獲什麼型別的異常。

跟在try 和catch 後面的語句必須刮在{}內,而整個try 塊組成一條完整的大語句。

void f(

)throw

(int

, some_class_type)

int main(

)catch

(int e)

catch

(some_class_type e)

// ... possibly other handlers ...

return 0;

}

異常規格申明是eh 特有的,。乙個空的異常規格申明表明函式不丟擲任何異常:

void f() throw()

如果函式沒有異常規格申明,它可以丟擲任何型別的異常:

void f()

當函式拋異常時,關鍵字throw 通常後面帶乙個被丟擲的物件:

throw i;

然而,throw 也可以不帶物件:

catch(int e)

它的效果是再次丟擲當前正**獲的物件(int e)。因為空throw 的作用是再次丟擲已存在的異常物件,所以它必須位於catch 語句塊中。mfc 也有再次丟擲異常的功能,seh則沒有,它沒有將異常物件交給過處理函式,所以沒什麼可再次丟擲的。

就象函式原型中的引數申明一樣,異常申明也可以是無名的:

catch(char *)

當這個處理函式捕獲乙個char *型的異常物件時,它不能操作這個物件,因為這個物件沒有名字。

異常申明還可以是這樣的特殊形式:

catch(...)

就象不定引數中的「...」一樣,異常申明中的「...」可以匹配任何異常的型別。   

1.標準異常物件的型別

在c++標準庫中,有些函式丟擲特定的異常,而另外一些根本不拋任何異常。

因為c++標準中沒有明確規定,所以c++的庫函式可以丟擲任何物件或不拋。但c++標準推薦執行庫的實現通過丟擲定義在中的異常型別或其派生型別來報告錯誤:

namespace

std

這些(異常)類只對c++標準庫有約束力。在你自己的**中,你可以丟擲(和捕獲)任何你所象要的型別。

標準庫標頭檔案申明幾個eh型別和函式:

namespace

std

exception是所有標準庫丟擲的異常的基類

uncaught_exception()函式在異常被丟擲卻沒有**獲時返回true,其他情況返回faslse。

terminate()是eh的應急處理。它在異常處理體系陷入了不可恢復狀態時被呼叫,經常是因為試圖重入(在前乙個異常正處理過程中又拋了乙個異常)。

unexpected()在函式丟擲乙個它沒有在「異常規格申明」中申明的異常時被呼叫。這個預料外的異常可能在退棧過程中被替換為乙個bad_excetion 物件。

執行庫提供了預設terminate_handler()和unexpected_handler() 函式處理對應的情況。你可以通過set_terminate()和set_unexpected()函式替換庫的預設版本。

eh執行於異常生命期的五個階段:

a.程式或執行庫遇到乙個錯誤狀況(階段1)並且丟擲乙個異常(階段2)。

b.程式的執行停止於異常點,開始搜尋異常處理函式。搜尋沿呼叫棧向上搜尋。

c.搜尋結束於找到乙個異常申明於異常物件的靜態型別相匹配(階段3)。於是進入相應的異常處理函式。

d.異常處理函式結束後,跳到此異常處理函式所在的try塊下面最近的一條語句開始執行(階段5)。這個行為意味著c++標準中異常總是終止。

c 丟擲標準異常

可以在自己的程式中丟擲某些標準異常。丟擲標準異常時,只需生成乙個描述該異常的字串,交給異常物件,它將成為what 返回的描述字串。std strings throw std out of range s throw std out of range out of range somewhere,so...

C 標準庫異常

標準庫中也提供了很多的異常類,它們是通過類繼承組織起來的。異常類繼承層級結構圖如下 每個類所在的標頭檔案在圖下方標識出來。標準異常類的成員 在上述繼承體系中,每個類都有提供了建構函式 複製建構函式 和賦值操作符過載。logic error類及其子類 runtime error類及其子類,它們的建構函...

MFC異常 與C 標準異常

1mfc異常 mfc 較好地將異常封裝到cexception類及其派生類中,自成體系,下表給出了mfc 提供的預定義異常 異常類 含義 cmemoryexception 記憶體不足 cfileexception 檔案異常 carchiveexception 存檔 序列化異常 cnotsupporte...