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(); //虛函數
}
這裡需要說明的是 what() 函數。what() 函數返回一個能識別異常的字符串,正如它的名字“what”一樣,可以粗略地告訴你這是什麼異常。不過C++標准並沒有規定這個字符串的格式,各個編譯器的實現也不同,所以 what() 的返回值僅供參考。
下圖展示了 exception 類的繼承層次:
圖:exception 類的繼承層次以及它們所對應的頭文件
先來看一下 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 類型。
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
算術計算下溢。