發新話題

C++ Gossip - 物件導向《例外處理》 標準例外類別

C++ Gossip - 物件導向《例外處理》 標準例外類別

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

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。