2011-10-30 7 views
0

をキャッチそれが言うように)。したがって、いくつかの例外がスローされる可能性があるので、conn.Open()はこの節にあります。真のコーディング規約/してみてください/のは、私はこのコードを得たと仮定しましょう

今、正しいコーディングアプローチですか?見てください:SqlCommandのコンストラクタはexceptinも投げませんが、コードの削減のためにcmd.ExecuteNonQuery()と一緒に入れました。両方ともtry/catchの中に入れました。

または、

多分、この代わりにこの1つが必要ですか?あなたの第二のアプローチは良いcatch句(例外のロギング)あなたは本当に1が十分

で、2倍tryブロックを必要としません... と

internal static bool WriteTransaction(string command) 
{ 
    using (SqlConnection conn = new SqlConnection(SqlConnectionString)) 
    { 
     try { conn.Open(); } 
     catch { return false; } 

     using (SqlCommand cmd = new SqlCommand(command, conn)) 
      try { cmd.ExecuteNonQuery(); } 
      catch { return false; } 
    } 

    return true; 
} 

(私の英語のため申し訳ありません)

+3

ログに記録せずに例外を捕まえて飲み込まないでください。これが野生に入ると、あなたはひどくひどく痛むでしょう、そして、あなたは分離できないバグに終わります。 –

答えて

1

例外を意味のある方法で処理できない限り、それをキャッチしないでください。むしろ、call-stackを伝播させます。

たとえば、どのような条件下で、SqlCommandExecuteNonQuery()例外をスローすることができますか?いくつかの可能性は、不適切に形成されたSQLクエリ、実行できないか、またはデータベースサーバへの接続を失ったことです。あなたはこれらすべてを同じように扱いたくはありませんよね?

処理を考慮する必要がある例外は、SQLExceptionデッドロック(エラー番号)です。

コメントで指摘したように、最低限、例外を記録する必要があります。

[ところで、WriteTransaction()あなたが示されているコードを与え、おそらくその方法の貧名前です。]

0

間違っている - いいえにはtry catchが必要です。これをキャッチしても、とにかく実行されているため、クエリを実行することはできません。あなたのキャッチブロックでは、その問題を "修復"しようとすることができますが、それはあなたに何を与えるでしょう - whileループwhile catch

+0

説明してください。 – AgentFire

+0

'conn.Open()'の後の接続が正常に開かれ、LABケーブルが壊れた場合はどうなりますか?それはアプリケーションをクラッシュさせるだろうか? – AgentFire

+0

ラボケーブルが壊れていますか?あなたのアプリは本当にケーブルについて気にする必要がありますか? – dantuch

0

私はあなたの最初の解決策が良いと思うのは、接続を確立しようとするとその接続でコマンドを実行しようとすると便利ではないということです。
エラーが発生した場合は、直接catchブロックを実行してオブジェクトを破棄し、2つ目の場合は2つの例外を処理し、メモリをあまり使用しません。

1

あなたの最初のコードサンプルは、単一のtry-catchブロックで、第二に相当します。しかし、最初の方が読みやすく、短くなります。


アプローチを符号化する通常のC#はあなたのコードの非常にトップ層以外で例外をキャッチしないであることそれは念頭に値します。

これに関するよく執筆された参考資料は、ここにあります:http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

この場合、メソッドが成功または失敗したことを示すブールを返す代わりに、このメソッドをテストすると、メソッドをvoidにして単に "予期しない例外"トップレベル例外ハンドラ

データベースへの書き込みの例外処理は、この一般的なルールのわずかな例外と考えることができますが、私の個人的なアプローチは、並行処理の問題を特定し、数回リトライする場合です。

0

あなたの最初のアプローチは、非常に簡単な理由から好ましい方法です:メソッドの2つのバージョンは動作に関しては同じですが、最初のメソッドはコードが少なくて済みます。

時にはそれがコードの行を数えるのと同じくらい簡単です; - )...

HTH!

P.S. このメソッドではtry/catchステートメントはまったくありませんが、この内部メソッドが呼び出される上位レベルに配置します。

0

あなたのメソッド 'WriteTransaction'がすべての例外を呑み込んで、トランザクションの成功を返すかどうかを考えれば、メソッド全体で1つのtry/catchブロックを使用します。

internal static bool WriteTransaction(string command) { 
    try { 
     using (SqlConnection conn = new SqlConnection(SqlConnectionString)) { 
      conn.Open(); 

      using (SqlCommand cmd = new SqlCommand(command, conn)) { 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
    catch { 
     return false; 
    } 
    return true; 
} 

ここで、すべての例外をキャッチし、true/falseを返すのが適切かどうかを尋ねる必要があります。本番環境では、少なくとも例外をログに記録していない場合、どのようにエラーを診断し修正するつもりですか?

関連する問題