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文
スポンサーリンク