- PR -

例外の設定位置について

1
投稿者投稿内容
s_saku
会議室デビュー日: 2006/05/30
投稿数: 14
投稿日時: 2006-06-20 09:15
お世話になります。

C#2005でWindowsアプリを作成しています(DBにOracle8.1.7を使用)。

下記のようなクラスを作成し、DBへのアクセスを行っていますが、
例外の設定はどのあたりにするものなんでしょうか?

public class DB_ACCESS
{
  public int DATA_CHECK(string code)
  {
    int リターンコード;
    コネクション設定;
    SQLコマンド作成;
    パラメータ設定;
    データアダプタ設定;
    データセットに読み込み;
    if データあり
      リターンコード = 0;
    else
      リターンコード = -1;

    return リターンコード
  }
}

public class Form1:Form
{
  private void btnCheck_Click(object sender, EventArgs e)
  {
    DB_ACCESS da = new DB_ACCESS();
    int リターンコード = da.DATA_CHECK(txtCode.Text);
    if リターンコード = 0
      MessageBox.Show("該当データあり");
    else
      MessageBox.Show("該当データなし");
  }
}

「DATA_CHECK」メッソッドの中で例外処理を行うのか、「Form1」で例外処理を
行ったほうがいいのか悩んでいます。
「DATA_CHECK」メッソッドで例外処理をして、エラーコードをリターンコードに
セットして返したほうがいいのかなぁとも思いますが、皆さんはどのようにされていますか?
ご意見をお聞かせください。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-06-20 10:08
Form側に一票。
DATA_CHECKメソッドの戻り値はデータの有無だけにして(boolの方が良い?)
Form側で例外を捕まえる方が分かり易いと思います。

こんな感じ?
コード:
public class Form1:Form 
{ 
  private void btnCheck_Click(object sender, EventArgs e) 
  { 
	try
	{
	   DB_ACCESS da = new DB_ACCESS(); 
	   int リターンコード = da.DATA_CHECK(txtCode.Text); 
	   if リターンコード = 0 
	     MessageBox.Show("該当データあり"); 
	   else 
	     MessageBox.Show("該当データなし"); 
	}
	catch(SqlException ex)
	{
      MessageBox.Show("データベースでエラー発生"); 
	   ログにex.ToString()とか書込み;
	}
  } 
} 


あと、DATA_CHECKメソッド内でもfinally句でDB接続を閉じたり。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-20 10:09
引用:

s_sakuさんの書き込み (2006-06-20 09:15) より:

下記のようなクラスを作成し、DBへのアクセスを行っていますが、
例外の設定はどのあたりにするものなんでしょうか?


例外が想定できるところですね。
または例外が発生した時に、'特別' 何かをしなければならないところに '狭く' 配置します。

想定できないものは、処理続行不可能な例外にあたるので、必ずしも設定する必要はありません。
Application.ThreadException などで、ログ出力やエラー報告くらいはしますけど。

# と書くと、"むやみにキャッチしないでね~" を貼られそうw

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-06-20 10:46
引用:

「DATA_CHECK」メッソッドの中で例外処理を行うのか、「Form1」で例外処理を
行ったほうがいいのか悩んでいます。
「DATA_CHECK」メッソッドで例外処理をして、エラーコードをリターンコードに
セットして返したほうがいいのかなぁとも思いますが、


オブジェクトの性質によりそれぞれの「返値」と「返す例外」をまず定義したほうがよいのではないでしょうか。
#その結果、利用者の振る舞いが決まる

いずれにしろ、例外(エラー)の上位への連鎖方法は悩みますね。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-06-20 11:11
引用:

じゃんぬねっとさんの書き込み (2006-06-20 10:09) より:
または例外が発生した時に、'特別' 何かをしなければならないところに '狭く' 配置します。


なわけで今回は何かをした後に再スローかねぇ。
s_saku
会議室デビュー日: 2006/05/30
投稿数: 14
投稿日時: 2006-06-20 13:25
皆さん、ご意見ありがとうございます。

「Select」だけとかだと、特に必要ないんでしょうか。

DBの更新を行うような場合だと、トランザクションを考えるとメッソド内の方がよかったりするんでしょうか?

こんな感じ?

public class DB_ACCESS
{
  public int DB更新(DataSet ds)
  {
    int リターンコード;
    Try
    {
      コネクション設定;
      SQLコマンド作成;
      パラメータ設定;
      データアダプタ設定;
      トランザクション開始;
      DB更新;
      コミット;
    }
    リターンコード = 0;

    catch(OracleException ex)
    {
      ロールバック;
      リターンコード = ex.Code;
    }

    return リターンコード
  }
}

Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-06-20 14:08
引用:

じゃんぬねっとさんの書き込み (2006-06-20 10:09) より:
# と書くと、"むやみにキャッチしないでね~" を貼られそうw


を重視してForm側で例外処理としたわけですが
サンプルとは異なり実際のプログラムでは多様な処理を下位クラスで行う事になるので
各々適切な例外処理を行い且つ例外を握り潰さない為には
引用:

ぶさいくろうさんの書き込み (2006-06-20 11:11) より:
なわけで今回は何かをした後に再スローかねぇ。


と云う事になるのだろうか

追加
引用:

    catch(OracleException ex)
    {
      ロールバック;
      リターンコード = ex.Code;
    }



返り血は本来の目的にだけ使用して他の意味を持たせない方が単純でよろしいかと思います。
例外は再投して呼び元で捕け止めてあげましょう。


[ メッセージ編集済み 編集者: Yam 編集日時 2006-06-20 14:19 ]
1

スキルアップ/キャリアアップ(JOB@IT)