try文を用いたエラークラスのthrowの仕方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

try文を用いたエラークラスのthrowの仕方

#1

投稿記事 by taketoshi » 12年前

今、あるアプリケーションを作っています。
try,catch構文でエラー処理を実装しようかと思っておりまして
エラーが発生したら各クラスのメソッドからエラークラスをthrowし
catchで捕まえてアプリケーションを終了する等の処理を行いたいと思っています。

知りたいのは、try文を用いてエラー処理を行う際の一般的な記述方法です。
試しにテストコードを書いてみましたが、メイン関数で宣言したエラークラスを
それぞれの関数に渡さないといけない為、凄く冗長な感じがします。

皆さんどの様にエラー処理の実装をしているのでしょうか。
ご教授お願いいたします。

コード:

#include "stdafx.h"


//エラークラスの定義
class error{
public:
	int EndApplication();
};

int error::EndApplication(){

	printf("errorクラスからアプリケーションを終了します\n");

	return 0;
}

//仮のクラス
//ここからエラーをthrowする
class hoge{

public:
	int temp;

	//エラークラスを呼び出す関数
	int get();
	int CallError(error *);
};

//数字を入力する関数
int hoge::get(){

	printf("数字を入力して下さい\n");
	scanf("%d",&temp);

	return 0;
}

//エラーを呼び出す関数
//エラークラスへのポインタを引数として受け取る
int hoge::CallError(error *er){

	//入力された数字が0以下ならばエラーをthrowする
	if(temp < 0){
		//ポインタで受け取っているエラークラスをthrowする
		throw er;
	}else{
		printf("普通に終了します\n");
	}

	return 0;
}

//メイン関数
int _tmain(int argc, _TCHAR* argv[])
{
	//クラスをインスタンス化
	hoge *hg = new hoge();
	//エラークラスをインスタンス化
	error *err = new error();;

	try{
		hg->get();
		hg->CallError(err);
	}
	catch(error *er){
		er->EndApplication();
	}

	delete[] err;
	delete[] hg;

	return 0;
}



アバター
a5ua
記事: 199
登録日時: 13年前

Re: try文を用いたエラークラスのthrowの仕方

#2

投稿記事 by a5ua » 12年前

コード:

throw 例外クラス();
とすれば、例外クラスの一時オブジェクトを作ってthrowすることができます。
catchしたオブジェクトは、catchブロックを抜ければ自動で削除されるので、deleteの必要はありません。

コード:

#include <tchar.h>
#include <stdio.h>
 
 
//エラークラスの定義
class error{
public:
    int EndApplication();
};
 
int error::EndApplication(){
 
    printf("errorクラスからアプリケーションを終了します\n");
 
    return 0;
}
 
//仮のクラス
//ここからエラーをthrowする
class hoge{
 
public:
    int temp;
 
    //エラークラスを呼び出す関数
    int get();
    int CallError();
};
 
//数字を入力する関数
int hoge::get(){
 
    printf("数字を入力して下さい\n");
    scanf("%d",&temp);
 
    return 0;
}
 
//エラーを呼び出す関数
//エラークラスへのポインタを引数として受け取る
int hoge::CallError(){
 
    //入力された数字が0以下ならばエラーをthrowする
    if(temp < 0){
        //ポインタで受け取っているエラークラスをthrowする
        throw error();
    }else{
        printf("普通に終了します\n");
    }
 
    return 0;
}
 
//メイン関数
int _tmain(int argc, _TCHAR* argv[])
{
    //クラスをインスタンス化
    hoge *hg = new hoge();

    try{
        hg->get();
        hg->CallError();
    }
    catch(error er){
        er.EndApplication();
    }

    delete[] hg;
 
    return 0;
}

たかぎ
記事: 328
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: try文を用いたエラークラスのthrowの仕方

#3

投稿記事 by たかぎ » 12年前

一般的ということなので...

コード:

#include <memory>
#include <string>
#include <stdexcept>
#include <cstdlib>
#include <cstdio>

class error : public std::runtime_error
{
public:
    explicit error(std::string const& message)
        : std::runtime_error(message)
    {
    }
};

//仮のクラス
//ここからエラーをthrowする
class hoge{
 
public:
    int temp;
 
    //エラークラスを呼び出す関数
    int get();
    int CallError();
};
 
//数字を入力する関数
int hoge::get(){
 
    std::printf("数字を入力して下さい\n");
    std::scanf("%d",&temp);
 
    return 0;
}
 
//エラーを呼び出す関数
//エラークラスへのポインタを引数として受け取る
int hoge::CallError(){
 
    //入力された数字が0以下ならばエラーをthrowする
    if(temp < 0){
        //ポインタで受け取っているエラークラスをthrowする
        throw error("負の値が入力されました。");
    }else{
        std::printf("普通に終了します\n");
    }
 
    return 0;
}

int main()
try
{
    std::unique_ptr<hoge> hg(new hoge());
    hg->get();
    hg->CallError();
}
catch (std::exception& e)
{
    std::fprintf(stderr, "例外発生: %s\n", e.what());
    return EXIT_FAILURE;
}
こんな感じでしょうか?

たかぎ
記事: 328
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: try文を用いたエラークラスのthrowの仕方

#4

投稿記事 by たかぎ » 12年前

一応、補足説明しておきます。

例外オブジェクトは、必ず参照で捕捉するようにしてください。
ポインタで捕捉すると、そのポインタが指すオブジェクトの解放方法がいろいろ考えられるので安全性に欠けます。
値で捕捉すると、スライシングの問題が発生します。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: try文を用いたエラークラスのthrowの仕方

#5

投稿記事 by taketoshi » 12年前

お二方ご教授ありがとうございます。

>a5uaさん
自動的にdeleteされるとは知りませんでした。
猫c++を読んでいたのですが、さわり位しか書いてないんですよね・・。
勉強になりました。

>たかぎさん
補足ありがとうございます。


お二人の記述方法で書き進めます。ありがとうございました。

アバター
a5ua
記事: 199
登録日時: 13年前

Re: try文を用いたエラークラスのthrowの仕方

#6

投稿記事 by a5ua » 12年前

catchしたオブジェクトは、catchブロックを抜ければ自動で削除されるので、deleteの必要はありません。
誤解を与えそうなので補足しますが、
私が示したコードでは、例外オブジェクトはnewで確保していないので、deleteの必要がないという意味で書きました。
catchしたオブジェクトは特別にdeleteしなくてもよいという意味ではありません。
taketoshiさんが最初に示したコードのように、newで作成したオブジェクトは、当然deleteしなければなりません。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: try文を用いたエラークラスのthrowの仕方

#7

投稿記事 by taketoshi » 12年前

>a5uaさん

なるほど。解かりました
重ねて有り難うございます。

閉鎖

“C言語何でも質問掲示板” へ戻る