C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 例外処理について


(過去ログ 66 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■38334 / inTopicNo.1)  例外処理について
  
□投稿者/ 七篠 (41回)-(2009/07/11(Sat) 11:21:00)

分類:[C/C++] 

こんにちは。

現在、例外処理処理について悩んでいます。
例えば、自前で用意した可変長配列を使用する関数内で、不正なインデックスが引数に渡された時に例外を送出しようと思っています。

前提条件として
    @: その関数内では例外をキャッチして何かを開放したりする必要はありません。
    A: 可変長配列の方でも不正なインデックスでアクセスしようとすると例外を出すようになっています。

現在考えている方法は二つです。
    @: 条件@がありますが、そのまま上位でキャッチして終了すると原因の特定が難しいので、関数内で try / catch し、自前の例外クラスに情報を追加して再送。
    A: 関数の始めにインデックスをチェックして例外を出す。 方法@があるのにこの方法を考えた理由は、方法@より数行ソースが短くなるためです。

方法Aはソースが短くなるのが魅力ですが、原因が同じ例外の発生源が統一されないのが気持ち悪いです。



この方法のどちらがいいか、あるいは他にオススメの例外処理があったらアドバイスいただけると幸いです。
引用返信 編集キー/
■38335 / inTopicNo.2)  Re[1]: 例外処理について
□投稿者/ επιστημη (2050回)-(2009/07/11(Sat) 11:54:26)
επιστημη さんの Web サイト
その二案、それぞれ小さなコードを示してもらえませんか?

引用返信 編集キー/
■38337 / inTopicNo.3)  Re[2]: 例外処理について
□投稿者/ 七篠 (42回)-(2009/07/11(Sat) 13:26:13)
お返事ありがとうございます。

改行は人によって入れる場所が違いますが、自分の書き方だと以下のようになります。

#define CHECK_EXCEPTION(expression, source, message)	{ if(expression){ throw Exception(source, message); } }

class Exception
{
public:
	String	source;
	String	message;
	
	Exception(const String& source, const String& message)
	{
		this->source	= source;
		this->message	= message;
	}
};

template <class K, class V>
class Map
{
	std::map<K, V> m;
	
	Bool IsContain(K key)
	{
		Bool ret = True;

		if(m.end() == m.find(key))
		{
			ret = False;
		}

		return ret;
	}
	
	V operator [] (K key)
	{
		if(False == IsContain(key))
		{
			throw Exceptin(L"Map::operator []", L"不正な引数です");
		}

		return m[key];
	}
};


class Test
{
	Map<Int, Void*>		m_map;
	
	// 方法@:中身9行
	Void Func_1(Int index)
	{
		try
		{
			Void*	p	= m_map[index];
		}
		catch(Exception e)
		{
			e.source	+= L"\r\nTest::Func_1";
			throw e;
		}
	}
	
	// 方法A:中身6行
	Void Func_2(Int index)
	{
		if(False == m_map.IsContain(index))
		{
			throw Exception(L"Test::Func_2", L"不正な引数です");
		}
			
		Void*	p	= m_map[index];
	}
	
	
	// 方法A※マクロ使用:中身3行
	Void Func_2(Int index)
	{
		CHECK_EXCEPTION((False == m_map.IsContain(index)), L"Test::Func_2", L"不正な引数です");
			
		Void*	p	= m_map[index];
	}
};

引用返信 編集キー/
■38339 / inTopicNo.4)  Re[3]: 例外処理について
□投稿者/ επιστημη (2051回)-(2009/07/11(Sat) 16:30:04)
επιστημη さんの Web サイト
んー...僕なら例外が表す「意味」がより正しい(設計者の意図を汲んだ)方を選びます。

引用返信 編集キー/
■38349 / inTopicNo.5)  Re[4]: 例外処理について
□投稿者/ 七篠 (43回)-(2009/07/11(Sat) 21:51:33)
お返事ありがとうございます。

> んー...僕なら例外が表す「意味」がより正しい(設計者の意図を汲んだ)方を選びます。
この場合は、どちらも「可変長配列に不正なインデックスでアクセスした」という意味です。
そうなると好みということになるのでしょうか?
引用返信 編集キー/
■38350 / inTopicNo.6)  Re[5]: 例外処理について
□投稿者/ επιστημη (2052回)-(2009/07/11(Sat) 21:56:53)
επιστημη さんの Web サイト
>>んー...僕なら例外が表す「意味」がより正しい(設計者の意図を汲んだ)方を選びます。
> この場合は、どちらも「可変長配列に不正なインデックスでアクセスした」という意味です。

単にそれだけの意味なら:

Void Func_1(Int index) { Void* p = m_map[index]; }

こんだけで済ませます僕なら。

引用返信 編集キー/
■38364 / inTopicNo.7)  Re[6]: 例外処理について
□投稿者/ 七篠 (44回)-(2009/07/12(Sun) 11:03:20)
お返事ありがとうございます。

> Void Func_1(Int index) { Void* p = m_map[index]; }
>
> こんだけで済ませます僕なら。
>

なるほど。
これだとスタックトレース的な情報が込められなくて、デバッグの時どうするのかとも思いましたが、
可変長配列内でブレークポイントしかければ問題ありませんね。
ソースも短くなるし、バイナリに入る情報も少なくて済みますし。

ありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -