1.try - catch
--------------
一個try後面可以跟多個catch;
--------------------------------
try
{
//可能拋出異常的語句
}
catch (exception_type_1)
{
//處理異常的語句
}
catch (exception_type_2)
{
//處理異常的語句
}
// ……
catch (exception_type_n)
{
//處理異常的語句
}
---------------------------------
若異常類型不能與所有列出的 exception 進行匹配,就只能交給系統處理,終止程序。
-------------------------------------------------------------------------------
2.throw 關鍵字
----------------
throw exceptionData;
double func (char param) throw (異常類型);
函數中拋出可能的異常
double func (char param) throw (); // 不拋出任何錯誤
double func (char param) throw (...); // 可拋出任何錯誤
在try語句塊中調用函數
在catch中捕獲並作出相應處理。
---------------------------------------------------------------------------------------
3.exception類
----------------------
C++語言本身或者標準庫拋出的異常都是 exception 的子類,稱為標準異常(Standard Exception)。
通過下面語句匹配所有標準異常:
try{
//可能拋出異常的語句
}catch(exception &e){
//處理異常的語句
}
--------------------------------------------------
exception 類位於 <exception> 頭文件中,他被聲明為:
class exception {
public:
exception () throw(); //構造函數
exception (const exception&) throw(); //拷貝構造函數
exception& operator= (const exception&) throw(); //運算符重載
virtual ~exception() throw(); //徐析構函數
virtual const char* what() const throw(); //虛函數
}
--------------------------------------------------------------------
exception 派生類:
----------------------------
直接派生類:
------------
A.頭文件:<stdexcept>
--------------------
a.logic_error 邏輯錯誤。派生類:
-----------------------------------------------------------------------------------
異常名稱 說明
---------------------------------------------------------------------------------------
length_error 試圖生成一個超出該類型最大長度的對象時拋出該異常,例如 vector 的 resize 操作。
---------------------------------------------------------------------------------
domain_error 參數的值域錯誤,主要用在數學函數中,例如使用一個負值調用只能操作非負數的函數。
---------------------------------------------------------------------------------
out_of_range 超出有效范圍。
---------------------------------------------------------------------------------
invalid_argument 參數不合适。在標准庫中,當利用string對象构造 bitset 時,而 string 中的字符不是 ’0’ 或 ’1’ 的?候,拋出該異常。
---------------------------------------------------------------------------------
b.runtime_error 運行時異常。派生類:
-------------------------------------------------------------------------------
異常名稱 說明
--------------------------------------------------------------------------------
range_error 計算結果超出了有意義的值域範圍。
--------------------------------------------------------------------------------
overflow_error 算數計算上溢。
--------------------------------------------------------------------------------
underflow_error 算數計算下溢。
--------------------------------------------------------------------------------
B.頭文件:<new>
---------------
bad_alloc 使用 new 或 new[]分配內存失敗時拋出的异常。
C.頭文件:<typeinfo>
--------------------
bad_typeid 使用 typeid 操作一個 NULL 指針,而且該指針是帶有虛函數的類,這時拋出 bad_typeid 异常。
bad_cast 使用 dynamic_cast 轉換失敗時出的异常。
D.頭文件:<ios>
--------------------
ios_base::failure io 過程中出現的异常。
E.頭文件:<exception>
--------------------
bad_exception 是個特殊的异常,如果函數的异常列表里聲明了 bad_exception 异常,當函數內部拋出了异常列表中沒有的异常時,
如果調用的 unexpected() 函數中拋出了异常,不論什么類型,都將被替換為 bad_exception 類型。