2016-05-07 4 views
0

私は自分自身にC#を教えていますが、現時点ではtry catchブロックを開発中です。これは、データベースに書き込むことです。C#データベースクエリから劣化する最良の方法

try 
    { 
     //Write to Database 
    } 
    catch (SqlException ex) 
    { 
     //report issue 
     //close connection 
    } 
    catch (Exception ex) 
    { 
     //report issue 
     //close connection 
    } 
    finally 
    { 
     //close connection 
    } 

その他の例外はありますか?

接続文字列が失敗した場合にもチェックする必要がありますか?

または、SQLExceptionはそれ自身で十分に良いでしょうか?

+0

'finally'で明示的に接続を閉じるのではなく、接続を' using'ブロックの中に入れてください。また、最後にクローズした場合は、 'catch'でクローズする必要はありません。' finally'は 'catch'ブロックに行ってもまだ実行されます。 –

答えて

2

をキャッチし、SqlDataReaderますが配置されている。

using(var connection = new SqlConnection(connectionString) 
using(var command = new SqlCommand(procedureName, connection) 
{ 
    //etc 
} 

特にSqlExceptionまたはExceptionをキャッチについてのご質問に答えるために、答えはある - あなたがSqlException対その他の例外の結果として違った何かをするだろう場合はい、SqlException最初をキャッチ。しかし、あなたはおそらくそうではありません。おそらく理由はないので、いいえ、私はSqlExceptionのためだけに別のキャッチで気にしません。必要な場合にのみ実行してください。

これは疑問を残します。実際には、このメソッドで例外をキャッチする必要はありますか?答えはおそらくそうではありません。例外がスローされた場合、処理する必要があるものはすべてusingで処理されます。例外はそれを呼び出すメソッドにまったくバブルアップできます。ある時点でログを記録したいと思うでしょうが、すべての方法ですべての層にログを記録する必要はありません。たとえば、WCFサービスの場合、サービスメソッドが呼び出されたときにスローされる例外を記録するだけです。

何か別のやり方で対応できるように例外をキャッチする必要があるシナリオがあります。おそらく、いくつかのデータセットを照会していて、失敗した場合は、エラーを記録し、ダウンストリームの障害を引き起こすのではなく空の結果を返すことができます。しかしそれほど頻繁ではありません。

見て分かるものは、AOP-Aspect Oriented Programmingです。多くのメソッドは例外ログを必要としますが、実際にはそれらのクラスの機能ではありません。だから、あなたのクラスやメソッドのほとんどから無関係だが必要なコードを保つ方法があります。私はPostSharpにリンクしましたが、個人的にはWindsorを使用しています。これは、依存関係の注入と例外ハンドリングのようなものでメソッド呼び出しをラップするインターセプタの両方を提供するためです。

0

Exceptionクラスはgrnericクラスであり、それは、あなたはその何かを確実にするために、明示的なtry/catchを必要としない(該当する場合)あなたがSqlConnectionSqlCommand周りusingブロックを配置した場合、すべての例外

関連する問題