異常處理

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 類型。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值