Exceptions 異常提供了一種方法來對程序中的異常情況(如運行時錯誤)進行響應,將控制傳遞給稱為handlers處理器的特殊函數。
若要捕獲異常,則在異常檢查下放置一部分代碼。這是通過在 try-block中封裝代碼部分來實現的。當異常情況出現在該塊中時,會拋出異常,將控制轉移到異常處理程序。如果沒有拋出異常,則代碼將繼續正常,所有處理程序將被忽略。
通過從try 塊內部使用拋出關鍵字引發異常。使用關鍵字catch聲明異常處理程序,必須在try 塊之后立即放置:
// exceptions#include <iostream>using namespace std;int main () { try { throw 20; } catch (int e) { cout << "An exception occurred. Exception Nr. " << e << '/n'; } return 0;}結果為An exception occurred. Exception Nr. 20異常處理下的代碼包含在一個try塊中。在這個例子中,這個代碼只拋出一個異常:
throw 20;throw 表達式接受一個參數(在這種情況下,整型值20),它作為參數傳遞給異常處理程序。
異常處理程序在try塊的結束括號之后立即用catch關鍵字聲明。catch的語法類似于帶有一個參數的正則函數。此參數的類型是非常重要的,因為對throw 表達式傳遞的參數類型進行了檢查,只有在它們匹配的情況下,異常才會被該處理程序捕獲。
多個處理程序(即,多catch表達式)可以被鏈接;每一個具有不同的參數類型。只執行參數類型與拋出語句中指定的異常類型相匹配的處理程序。
try { // code here}catch (int param) { cout << "int exception"; }catch (char param) { cout << "char exception"; }catch (...) { cout << "default exception"; }在這種情況下,最后的處理程序會拋出的任何異常的類型既不是int也不是 char。 處理程序異常后,執行將在嘗試catch塊后恢復,而不是在拋出語句之后!。
也可以在更多外部try塊中嵌套try-catch塊。在這些情況下,我們有一個內部catch塊將異常轉發到外部級別的可能性。這是用表達式拋出,沒有參數。例如:
try { try { // code here } catch (int n) { throw; }}catch (...) { cout << "Exception occurred";}舊代碼可能包含動態異常規范。他們現在在C++不提倡的,但還是支持。一個動態的異常說明如下一個函數聲明,添加一個throw 說明符。例如:
double myfunction (char param) throw (int);這里聲明一個函數MyFunction,它帶有一個char類型參數和返回一個double類型的值。如果函數拋出一些類型不是int,函數調用 std::unexpected 而不是尋找一個處理程序或調用std::terminate
如果throw說明符是空的類型,這意味著std::unexpected 是被其他外部調用。沒有throw說明符函數(的正常功能)不調用std::unexpected ,但按照正常的路徑尋找自己的異常處理程序。
int myfunction (int param) throw(); // all exceptions call unexpectedint myfunction (int param); // normal exception handlingC++標準庫提供了一個基類用于對象被拋出的異常。它被稱為std::exception,并在頭文件中定義。這個類有一個虛成員函數叫what ,返回一個空終止字符序列(類型為char *),可以覆蓋在派生類中含有某種異常的描述。
// using standard exceptions#include <iostream>#include <exception>using namespace std;class myexception: public exception{ virtual const char* what() const throw() { return "My exception happened"; }} myex;int main () { try { throw myex; } catch (exception& e) { cout << e.what() << '/n'; } return 0;}我們放了一個捕獲異常對象的引用(在類型符通知)處理程序,因此這個catch也是exception的派生類,比如myex對象是myexception對象類型。
通過對C++標準庫異常類拋出異常來自這部分拋出的異常。這些是:
也從exception派生,頭文件定義了兩個泛型異常類型,這些異常類型可以由自定義異常繼承來報告錯誤: 
需要檢查的標準異常的一個典型例子是內存分配:
// bad_alloc standard exception#include <iostream>#include <exception>using namespace std;int main () { try { int* myarray= new int[1000]; } catch (exception& e) { cout << "Standard exception: " << e.what() << endl; } return 0;}通過本例中的異常處理程序捕獲是一個bad_alloc。因為bad_alloc來自標準庫類exception,它能被捕捉到(捕捉參考,捕捉所有相關的類)。
新聞熱點
疑難解答
圖片精選