異常是程式在執行期間產生的問題。c++ 異常是指在程式執行時發生的特殊情況,比如嘗試除以零的操作。
異常提供了一種轉移程式控制權的方式。
c++ 異常處理涉及到三個關鍵字:try、catch、throw。
關鍵字描述
throw
當問題出現時,程式會丟擲乙個異常。這是通過使用 throw 關鍵字來完成的。
catch
在您想要處理問題的地方,通過異常處理程式捕獲異常。catch 關鍵字用於捕獲異常。
trytry關鍵字覆蓋範圍中的**稱為保護**,這些**可能通過 throw 關鍵字丟擲異常,它後面通常跟著乙個或多個 catch 塊。
異常必須被丟擲,才可以**獲。也就是說如果想要 try / catch,必須有 throw。使用 try / catch 語句的語法如下所示:
我們需要保證丟擲異常與捕獲異常的型別相匹配,這裡丟擲了乙個型別為 const char* 的異常,因此,當捕獲該異常時,我們必須在 catch 塊中使用 const char*;如果丟擲的是 int ,那麼捕獲的時候也該是 int。
如果型別不匹配,那麼是無法捕獲異常的,程式會呼叫 adort 函式 終止程式。
catch(…) 表示捕捉任何型別的異常,不會存在型別不匹配的問題,缺點在於只能檢測到出現異常,不能發現到底是**出現異常。前面說到,一旦出現丟擲異常沒被處理的問題,系統將自動呼叫 abort() 函式,實際上,它觸發的是 terminate,我們可以自定義 terminate 的處理方法:
異常型別不匹配,無法捕獲異常,系統呼叫自定義 terminate 方法。
如果注釋掉:
c++ 提供了一系列標準的異常,定義在 「《exception》」 中,我們可以在程式中使用這些標準的異常。它們是以父子類層次結構組織起來的,如下所示:
異常描述
std::exception
該異常是所有標準 c++ 異常的父類。
std::bad_alloc
該異常可以通過 new 丟擲。
std::bad_cast
該異常可以通過 dynamic_cast 丟擲。
std::bad_exception
這在處理 c++ 程式中無法預期的異常時非常有用。
std::bad_typeid
該異常可以通過 typeid 丟擲。
std::logic_error
理論上可以通過讀取**來檢測到的異常。
std::domain_error
當使用了乙個無效的數學域時,會丟擲該異常。
std::invalid_argument
當使用了無效的引數時,會丟擲該異常。
std::length_error
當建立了太長的 std::string 時,會丟擲該異常。
std::out_of_range
該異常可以通過方法丟擲,例如 std::vector 和 std::bitset<>::operator。
std::runtime_error
理論上不可以通過讀取**來檢測到的異常。
std::overflow_error
當發生數學上溢時,會丟擲該異常。
std::range_error
當嘗試儲存超出範圍的值時,會丟擲該異常。
std::underflow_error
當發生數學下溢時,會丟擲該異常。
使用者可以自定義異常型別,異常型別並不受到限制,可以是內建資料型別如 int,double等,也可以是自定義的類,也可以從c++某個異常類繼承下來。
#include
#include
using
namespace std;
/*自定義異常類 myexception,過載 exception 的 what 方法*/
what() 是異常類提供的乙個公共方法,它已被所有子異常類過載。這將返回異常產生的原因。
如果你想捕獲標準異常 bad_alloc 丟擲的異常,可以這樣做。
catch
(bad_alloc & e)
throw 關鍵字除了可以用在函式體中丟擲異常,還可以用在函式頭和函式體之間,指明函式能夠丟擲的異常型別。有些文件中稱為異常列表。例如:
double func (char param) throw (int);
如果希望能夠丟擲多種型別的異常,可以用逗號隔開:
double func (char param) throw (int, char, exception);
如果不希望限制異常型別,那麼可以省略:
double func (char param) throw ();
**c++標準已經不建議這樣使用 throw 關鍵字了,**因為各個編譯器對 throw 的支援不同,有的直接忽略,不接受 throw 的限制,有的將 throw 作為函式簽名,導致引用函式時可能會有問題。上面的**在 gcc 下執行時會崩潰,在 vs 下執行時則直接忽略 throw 關鍵字對異常型別的限制,try 可以正常捕獲到丟擲的異常,程式並不會崩潰。
參考 參考
參考
C 異常處理
結構化異常 structured exception vs c 異常 c exception 大家都知道c 異常是c 語言的乙個特性,使用者可以使用throw的方式來丟擲異常,try catch 來捕獲異常。結構化異常是諸如,zero divided,access violations等異常,這些異...
c 異常處理
一 概述 c 自身有著非常強的糾錯能力,發展到如今,已經建立了比較完善的異常處理機制。c 的異常情況無非兩種,一種是語法錯誤,即程式中出現了錯誤的語句,函式,結構和類,致使編譯程式無法進行。另一種是執行時發生的錯誤,一般與演算法有關。關於語法錯誤,不必多說,寫 時心細一點就可以解決。c 編譯器的報錯...
C 異常處理
程式設計師常常忽視異常處理的重要性,這給他們自己的 造成相當大損害。本文將討論如何在c 中使用異常處理,並介紹在應用 中新增 片段以防止某些錯誤的一些簡單方法,這些錯誤可能導致程式異常終止。結構化異常處理 net框架提供一種標準的錯誤報告機制稱為結構化異常處理。這種機制依賴於應用中報告錯誤的異常。在...