2016-04-13 32 views
3

例外処理のベストプラクティスは内の例外処理ですか?例外処理内での例外処理

キャッチ内でカスタムオブジェクトを使用し、システムのほとんどのアプリケーションサーバー層でブロックする既存のC#(Framework 4.0)システムで作業しています。私は過度に偏執的なことかもしれないが、私はこれらに発生する可能性のある未処理の例外について自分自身を非常に心配見つける

public void DoSomeStuff(string sGUID) 
    { 
     try 
     { 
      // Foo 
     } 
     catch (Exception oEx) 
     { 
      oExceptions.Add(oEx); 

      if (oDBConn.NumberOfActiveTrans > 0) 
      { 
       oDBConn.Rollback(); 
      } 
     } 
     finally 
     { 
      oDBConn.DeleteLocksByGUID(sGUID); 
     } 
    } 

は、このコードベースのメソッドの次切り取らバージョンを考えてみましょう。

このように、次のような更新されたバージョンが受け入れ可能なプラクティスか、同じことを達成するためのよりよい方法がありますか?

public void DoSomeStuff(string sGUID) 
    { 
     try 
     { 
      // Foo 
     } 
     catch (Exception oEx) 
     { 
      oExceptions.Add(oEx); 

      try 
      { 
       if (oDBConn.NumberOfActiveTrans > 0) 
       { 
        oDBConn.Rollback(); 
       } 
      } 
      catch (Exception oEEx) 
      { 
       oExceptions.Add(oEEx); 
      } 
     } 
     finally 
     { 
      try 
      { 
       oDBConn.DeleteLocksByGUID(sGUID); 
      } 
      catch (Exception oFEx) 
      { 
       oExceptions.Add(oFEx); 
      } 
     } 
    } 
+0

私はデータベース内でトランザクションのロールバックを処理します(たとえば、データの更新/挿入にストアドプロシージャを使用するなど)。したがって、最初の 'try'ブロックで挿入/更新が失敗したときに' catch'ブロック内でトランザクションをロールバックする必要はありません。 (o.O) –

答えて

4

私は個人的に、それは無限連鎖することができ、finallytry catchブロックを追加しないでしょう。通常、あなたはfinallyに複雑なものを入れてはいけません。いずれにしても、予期せぬ例外は呼び出し元に捕らえられるべきです。

編集:コードに少し近いところを見て、私はなぜfinallyブロックのコードがtryブロック内にあるべきでないのか分かりません。

+0

finallyブロックに関して、複雑さと単純さを維持したいと思っています。しかし、特定の機能が完了したことをシステムが確認しようとしているシナリオでは、雨が降ったり輝いたりしますが、tryブロックはfinallyブロックで受け入れられるでしょうか? –

+1

する必要がある場合は、そのコードをリファクタリングして、独自のtry-catchブロックを持つメソッドにコードし、そのメソッドを最後に使用することができます。しかし、パニックに陥らないように、呼び出し側は予期せぬ例外をすべてキャッチする必要があります。 –

0

私は過度の編集的症例かもしれませんが、私は自分自身が非常に心配してこれらの問題が発生する可能性があります 可能性があります。

パニックにはなりません。 db層にエラーがある場合は、そこにキャッチしてください。

0

元のコードで最も危険なのは、エラーが発生した場合は、トランザクションのロールバックに失敗したです。トランザクションをロールバックしたときのエラーのみが再現されます。最初の例外がトランザクションをロールバックしなければならなかった原因はわかりません。それはあなたが最も気にするものです。

あなたが妄想になりたい場合は、トランザクションロールバックの失敗を記録します。しかし重要なことは、その点まであなたを得た以前の例外です。これは、呼び出し元の期待に応じてログに記録されるか、再スローされる必要があります。