C 異常處理 三 exception類

2021-06-29 13:27:33 字數 3489 閱讀 1079

1,exception

標頭檔案:

#include

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

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

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

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

#include class bad_hmean : public std::exception

// ...

};class bad_gmean : public std::exception

// ...

};

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

try

catch(std::exception& e)

否則,應分別捕獲它們。

c++庫定義了很多基於exception的異常型別。

1,stdexcept 異常類

該檔案定義了logic_error和runtime_error類,它們都是以公有類從exception派生而來的。

每個類所在的標頭檔案在圖下方標識出來.

標準異常類的成員:

① 在上述繼承體系中,每個類都有提供了建構函式、複製建構函式、和賦值操作符過載。 

② logic_error類及其子類、runtime_error類及其子類,它們的建構函式是接受乙個string型別的形式引數,用於異常資訊的描述; 

③ 所有的異常類都有乙個what()方法,返回const char* 型別(c風格字串)的值,描述異常資訊。

標準異常類的具體描述

異常名稱

描述

exception

所有標準異常類的父類

bad_alloc

當operator new and operator new,請求分配記憶體失敗時

bad_exception

這是個特殊的異常,如果函式的異常丟擲列表裡宣告了bad_exception異常,當函式內部丟擲了異常丟擲列表中沒有的異常,這是呼叫的unexpected函式中若丟擲異常,不論什麼型別,都會被替換為bad_exception型別

bad_typeid

使用typeid操作符,操作乙個null指標,而該指標是帶有虛函式的類,這時丟擲bad_typeid異常

bad_cast

使用dynamic_cast轉換引用失敗的時候

ios_base::failure

io操作過程出現錯誤

logic_error

邏輯錯誤,可以在執行前檢測的錯誤

runtime_error

執行時錯誤,僅在執行時才可以檢測的錯誤

logic_error的子類: 

異常名稱

描述

length_error

試圖生成乙個超出該型別最大長度的物件時,例如vector的resize操作

domain_error

引數的值域錯誤,主要用在數學函式中。例如使用乙個負值呼叫只能操作非負數的函式

out_of_range

超出有效範圍

invalid_argument

引數不合適。在標準庫中,當利用string物件構造bitset時,而string中的字元不是』0』或』1』的時候,丟擲該異常

runtime_error的子類: 

異常名稱

描述

range_error

計算結果超出了有意義的值域範圍

overflow_error

算術計算上溢

underflow_error

算術計算下溢

例:logic_error下的

domain_error:定義域由引數的可能取值組成

invalid_argument:值域由函式可能的返回值組成,指函式傳遞了乙個意料之外的值

out_of_bounds:通常指索引錯誤,如定義乙個陣列,其operator在使用索引無效時會引發該異常

一般而言:

logic_error系列異常表明存在可以通過程式設計修復的問題。

runtime_error系列異常表明存在無法避免的問題。

2,對於bad_alloc 異常與new

對於使用new導致的記憶體分配問題,c++的最新處理方式是讓new引發bad_alloc異常。

標頭檔案new包含bad_alloc類的宣告,它從exception公有派生來。

#include #include #include using namespace std;

struct big

;int main()

catch(bad_alloc& ba)

cout << "memory successfully allocated\n";

pb[0].stuff[0] = 4;

cout << pb[0].stuff[0] << endl;

delete pb;

return 0;

}

輸出:

trying to get a big block of memory:

caught the exception!

bad allocation

這裡,方法what()返回的字串「std::bad_alloc".

3, 空指標與new

例:int* pi = new (std::nothrow) int;

int* pa = new (std::nothrow) int[500];

#include #include #include using namespace std;

struct big

;int main()

cout << "memory successfully allocated\n";

pb[0].stuff[0] = 4;

cout << pb[0].stuff[0] << endl;

delete pb;

return 0;

}

輸出:

could not allocate memory.bye!

異常處理 Exception(三)

最近有點事,把這個系列給落下了,給大家道個歉,這裡還要感謝我的老婆,謝謝她一直對我的支援 系列回顧 1 異常處理 exception 一 2 異常處理 exception 二 通知方式 說明 email 這是最常見也是最方便的一種通知方式。優點 使用簡單 缺點 需要依賴於smtp伺服器等 sms 這...

Exception異常處理

1.exception 前言 在ios裡對異常的處理及捕獲,並沒有其它語言裡那麼常見,相信很多ios程式設計師都知道,更多的時候是對記憶體的的檢測與分析,檢測相關記憶體方面的問題。捕獲後傳送至伺服器,並且友好提示使用者錯誤,或則直接回滾到使用者操作前,阻止應用程式的崩潰。2.exception處理 ...

異常處理 Exception

一 異常類 1 在c 中所有的異常都是使用乙個異常型別的示例物件表示的,這些異常型別都是繼承自system.exception型別,或者直接使用system.exception型別的例項物件 2 在c 中,位於finally塊中的 可以保證不管 是正常結束,還是進入異常處理 塊,其中的語句均會被執行...