-1

例外のソースを明確に考えて、ビジネスレイヤーによってキャッチされる必要がある例外を処理したいデータアクセスレイヤーを作成しています。私はこのようなことをしています..

編集

private void OpenConnection()
        {
                if (ConnectionState.Closed == _connection.State)
                    _connection.Open();
        }

上記のコードでは、例外の理由を知っています。そして、メッセージを表示するためにBLで処理するために投げたい。

しかし、私はDLでこの関数を他のコード行でのみ使用しています。

protected DataTable GetDataTable(string Query)
 {
     DataTable dt =new DataTable();
     SqlCommand cmd = InitializeCommand(Query);

     SqlDataAdapter adp = new SqlDataAdapter(cmd);
     try
     {
         OpenConnection();
         adp.Fill(dt);
         CloseConnection(true);
         return dt;
     }
     catch (SqlException ex)
     { throw ex; }
     finally
     {
         adp.Dispose();
         cmd.Dispose();
     }
 }

OpenConnection()接続を開こうとしているときに例外が発生した場合、例外throw exを返すと予想していたときに、OpenConnection 自体の行でアプリケーションがクラッシュします。この問題をどのように処理すればよいですか。GetDataTableさらに、例外が発生した場合、この時点で発生したのと同じ詳細でどのような種類の例外をスローする必要があるか、2 番目の関数で私の質問を拡張します。私はこの方法しか知りませんが、これは私が思う素晴らしい方法です。

throw new ApplicationException(ex.message,ex.innerexception)

編集

サーバーへの接続が失われたか、間違った接続文字列を使用しているとします。BL の GetDataTable 関数を使用します。どこで例外が発生し、どこで処理すればよいですか? DLで発生した問題を知りたいです。BLを考えるとDLのコードがわからない

4

2 に答える 2

1

できることはいくつかあります。

問題が発生した場所に応じて、さまざまなtryブロックを作成し、新しい例外をスローできます。

 try
 {
     OpenConnection();
     adp.Fill(dt);
 }
 catch (SqlException ex)
 { throw new SqlException("Could not open/populate", ex); }
 finally
 {
     adp.Dispose();
     cmd.Dispose();
 }

 try
 {
     CloseConnection(true);
     return dt;
 }
 catch (SqlException ex)
 { throw new SqlException("Could not close connection", ex); }
 finally
 {
     adp.Dispose();
     cmd.Dispose();
 }
于 2010-07-08T08:34:41.137 に答える
0

私の提案は、キャッチを削除して再スローすることです。これにより、例外のスタック トレースが破棄されるためです。とにかく例外をスローしているので、キャッチなしで試すことができます。このようにして、スタック トレースを保持しながら、finally を引き続き使用できます。

protected DataTable GetDataTable(string Query)
 {
     DataTable dt =new DataTable();
     SqlCommand cmd = InitializeCommand(Query);

     SqlDataAdapter adp = new SqlDataAdapter(cmd);
     try
     {
         OpenConnection();
         adp.Fill(dt);
         CloseConnection(true);
         return dt;
     }
     finally
     {
         adp.Dispose();
         cmd.Dispose();
     }
 }
于 2010-07-08T08:42:04.263 に答える