C++提供了標準的例外處理類別,所有的標準例外處理類別都衍生自exception類別,使用它必須包括exception標頭檔,而 exception類別衍生出來的logic_error類別與runtime_error類別在使用時,則必須包括stdexcept標頭檔,以下列出 exception與其衍生類別的繼承架構:
exception
bad_alloc
bad_exception
ios:base:failure
bad_cast
bad_typedid
logic_error
lehgth_error
domain_error
invalid_argument
out_of_range
runtime_error
overflow_error
range_error
underflow_error
當錯誤發生而丟出例外物件時,您可以使用what()方法來取得錯誤訊息,這個錯誤訊息視您所採用的編譯器而有所不同,下面這個程式故意存取超出字串範圍的資料,以引發out_of_range例外並顯示訊息:
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
int main() {
try {
string str("caterpillar");
cout << "str.substr(20, 2) = "
<< str.substr(20, 2)
<< endl;
}
catch(out_of_range e) {
cout << "錯誤: "
<< e.what()
<< endl;
}
return 0;
}
執行結果:
下面這個程式則是利用迴圈不斷配置記憶體,直到記憶體不足而發生bad_alloc例外為止,您可以觀察到例外的捕捉與訊息:
#include <iostream>
#include <stdexcept>
using namespace std;
int main() {
double *ptr;
do {
try {
ptr = new double[1000000];
}
catch(bad_alloc err) {
cout << "配置失敗"
<< err.what()
<< endl;
return 1;
}
cout << "配置OK\n";
} while(ptr);
return 0;
}
執行結果:
....
配置OK
配置OK
配置OK
配置OK
配置OK
配置OK
配置OK
配置失敗St9bad_alloc |