1、簡介
C++語言本身或者標准庫拋出的異常都是exception的子類,稱為標准異常。捕獲所有的標准異常的語句:
try{ //可能拋出異常的語句 }catch(exception &e) //使用引用是為了提高效率,不然需要經過一次對象拷貝過程。 { //處理異常的語句 }
1.1 exception類
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(); //虛函數 }
what函數返回一個能識別異常的字符串,可以告訴程序員這是什么異常,但是C++標准並沒有規定這個字符串的格式,各個編譯器的實現也不同,因此what的返回值僅供參考。
1.2 exception類的繼承層次
1.2.1 exception的直接派生類
異常名稱 |
說 明 |
---|---|
logic_error |
邏輯錯誤。 |
runtime_error |
運行時錯誤。 |
bad_alloc |
使用new或new[ ]分配內存失敗時拋出的異常。 |
bad_typeid |
使用typeid操作一個 NULL 指針,而且該指針是帶有虛函數的類,這時拋出 bad_typeid 異常。 |
bad_cast |
使用 dynamic_cast 轉換失敗時拋出的異常。 |
ios_base::failure |
io 過程中出現的異常。 |
bad_exception |
這是個特殊的異常,如果函數的異常列表里聲明了 bad_exception 異常,當函數內部拋出了異常列表中沒有的異常時,如果調用的 unexpected() 函數中拋出了異常,不論什么類型,都會被替換為 bad_exception 類型。 |
1.2.2 logic_error的派生類
異常名稱 |
說 明 |
---|---|
length_error |
試圖生成一個超出該類型最大長度的對象時拋出該異常,例如 vector 的 resize 操作。 |
domain_error |
參數的值域錯誤,主要用在數學函數中,例如使用一個負值調用只能操作非負數的函數。 |
out_of_range |
超出有效范圍。 |
invalid_argument |
參數不合適。在標准庫中,當利用string對象構造 bitset 時,而 string 中的字符不是 0 或1 的時候,拋出該異常。 |
1.2.3 runtime_error的派生類
異常名稱 |
說 明 |
---|---|
range_error |
計算結果超出了有意義的值域范圍。 |
overflow_error |
算術計算上溢。 |
underflow_error |
算術計算下溢。 |