stackクラスのテストをtry~catch文で書く

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

C++のクラス定義・クラスでのスタック実装では、エラー処理としてassertを利用していましたが、これをtry~catch文に変更してみます。

スポンサーリンク

assertによるエラー処理は・・・

assert((count >= 0) &&
    (count < static_cast<int>(sizeof(data)/sizeof(data[0]))));

というスタックデータの要素数の範囲外エラーだけです。
上記のassert文を、以下のようにエラーを補足した場合、エラーをthrowするように書き換えます。

if ((count < 0) || 
    (count >= static_cast<int>(sizeof(data)/sizeof(data[0])))) {
        error overflow("要素のサイズをオーバーしました");
        throw overflow;        // エラーをthrowする
}

範囲外エラーのクラスは、以下のようになります。

class error {
public:
    const std::string why;    // エラーの原因
    
    // 範囲外エラーをメッセージで初期化。
    error(const std::string& why_m) : why(why_m);
};

ちょっと長いですけど、以下にコード全文。

/***********************************
Stack
 整数型のスタックを実装
***********************************/
 
#include <assert.h>
#include <cstdlib>
#include <iostream>
#include <string>
 
const int STACK_SIZE = 100;    // スタックの最大サイズ
 
/***********************************
error -- 範囲外エラー処理のクラス
***********************************/
class error {
public:
    const std::string why;    // エラーの原因
    
    // 範囲外エラーをメッセージで初期化。
    error(const std::string& why_m) : why(why_m) {}
};
 
 
/***********************************
stackクラス
 整数型のスタックを実装するクラス
 
メンバ関数(メソッド)
 push        :スタックに要素プッシュ
 pop        :スタックから要素ポップ
 get_count    :要素数をカウント
***********************************/
 
class stack {
    private:
        int count;    // スタック内の要素の数
        int data[STACK_SIZE];    // 要素
 
    public:
        // スタック初期化
        stack() : count(0) {};
 
        // スタックに要素をプッシュ
        void push(const int item);
        // スタックから要素をポップ
        int pop();
 
        // 要素数countをゲット
        int get_count();
};
 
 
// stack::push()
inline void stack::push(const int item) {
    if ((count < 0) || 
        (count >= static_cast<int>(sizeof(data)/sizeof(data[0])))) {
            error overflow("要素のサイズをオーバーしました");
            throw overflow;        // エラーをthrowする
    }
    
    data[count] = item;
    ++count;
}
 
// stack::pop()
inline int stack::pop() {
    // スタックの要素数をデクリメント
    --count;
 
    if ((count < 0) || 
        (count >= static_cast<int>(sizeof(data)/sizeof(data[0])))) {
            error underflow("要素のサイズをオーバーしました。(要素数0以下)");
            throw underflow;        // エラーをthrowする
    }
    
    // 最後の値を返す
    return (data[count]);
}
 
// stack::get_count()
inline int stack::get_count() {
    return count;
}
 
// stack生成
static stack test_stack;
 
 
/**************************************
 * テストルーチン
 **************************************/
int main() {
    // 要素をスタックにたくさんプッシュ。
    // 例外発生の可能性があるのでtryで囲む
 
    try {
        int i;
        for(i = 0; i < 10000; i++) {
            test_stack.push(i);
        }
    }
    catch (error& err) {
        std::cerr << "エラーが起こりました。\n";
        std::cerr << "原因: " << err.why << "\n";
        exit (8);
    }
    catch (...) {    // ...ですべての例外をキャッチ
        std::cerr << "なんらかのエラーが起こりました。\n";
        exit (8);
    }
 
    return 0;
}

1万回ループしてスタックにpushを行っていますので、要素範囲外エラーが起こります。
その実行結果。

エラーが起こりました。
原因: 要素のサイズをオーバーしました
スポンサーリンク
 
スポンサーリンク