標準例外類別


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;
}

執行結果:

錯誤: basic_string::substr

下面這個程式則是利用迴圈不斷配置記憶體,直到記憶體不足而發生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