2017-02-06 54 views
0
の声明

文を使用して、ネストされた内部例外を処理するための正しい方法は何を使用して、ネストした内部例外をキャッチ?私は、次のコードの一部を持っている:はNHibernateは

public void Create(Entity entity) 
{ 
    try 
    { 
     using (ISession session = NhibernateHelper.OpenSession()) 
     { 
      try 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        session.Save(entity); 
        transaction.Commit(); 
       } 
      } 
      catch (TransactionException transactionException) 
      { 
       // log it 
       throw; 
      } 
     } 
    } 
    catch (TransactionException transactionException) 
    { 
     // log it 
     throw; 
    } 
    catch (SessionException sessionException) 
    { 
     // log it 
     throw; 
    } 
    catch (Exception exception) 
    { 
     // log it 
     throw; 
    } 
} 

人々は/内側に使用してネストされたcatch文を試し置くとき、私はいくつかの答えを見ました。私はステートメントの使用がtry/finallyで構成されていることを知っています。私の質問はすべての可能な例外をキャッチする正しい方法です。 catch文の中でロールバックを行うべきですか?私にそれを行う正しい方法を教えてください。

+0

あなたは、Webアプリケーションでこれを使用していますし、ロールバックの周りにtryキャッチをログに記録。? mvc? winforms?最初の一見では、私はあなたのアプリでこれのようなコードを望んでいないと言うでしょう。 – Fran

答えて

2

私はできるだけ "try catch"節を最小限に抑える傾向があります。

ネスティング(例外を飲み込むていないながら)「キャッチをしてみてください」と、それぞれキャッチをログに記録するには、ログをbloats複数回ログインするために、同じ例外を引き起こす可能性があります。どこにでも "キャッチしよう"とすると、コードが肥大化します。

私は明示的に失敗したトランザクションをrollbackingする必要が表示されません。デフォルトでは処分に非コミットされたトランザクションがロールバックされます。

MVC/webformの私の通常のパターンは、ロギングの例外としてグローバルなアクションフィルタ(通常はHandleErrorAttributeから派生したもの)や専用のIHttpModuleを使用することです。したがって、例外を飲み込まずにログをとるだけの場所で「キャッチしよう」必要はありません。

(私はfilterContext状態に応じてそれらOnActionExecutedをコミットまたはrollbacking、それらをOnActionExecutingを開くためのアクションフィルタを使用していますので、MVCで、私は通常、トランザクションを明示的に失敗したロールバックします。そこでは、エラーがあった場合は特に、私は嚥下を追加することができますそれはあまりにも失敗したこと、そして私は1つをマスクするべきではありません。この障害はrollbackingをしようとするアプリを引き起こしたことを検討)

+0

'ExceptionFilterAttribute'と' OnException'メソッドはどうですか?私はそれを使用する場合try/catchステートメントを使用する必要がありますか? –

+1

必ずしもそうではありません。 Personnaly私はしばしば、エラー処理コードの他のいくつかのバグ/トラブルによって元のエラーをマスクすることを避けるために、エラー処理コードで嚥下を試みます(ログを使用します):エラー処理エラーではなくビジネス例外に関する情報を取得します。 –

0

は、私はいつもBeginTransaction()直後のtry..catchブロックを開始するパターンに従ってください。それ以外

は、私はそれが他の例外のチェックを追加しないために罰金だと思う - それは、呼び出し元のコードに出て伝播してみましょう。

using (var session = NhibernateHelper.OpenSession()) 
{ 
     using(var transaction = session.BeginTransaction()) 
     { 
      try 
      { 
       // 
       // Add a block of code here which queries and 
       // modifies data 
       // 
       // 
       transaction.Commit(); 
      } 
      catch(Exception ex) 
      { 
       transaction.RollBack(); 
       throw; 
      } 
     } 
}