stackクラスのテストをtry~catch文で書く
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
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を行っていますので、要素範囲外エラーが起こります。
その実行結果。
エラーが起こりました。 原因: 要素のサイズをオーバーしました
スポンサーリンク
<< 前の記事 : try~catch文
- - 関連記事 -
- try~catch文
スポンサーリンク