2016-09-22 5 views
1

それは私のパラドックスです。私はすべての例外を処理できますか、それを見つけて解決することができます。このサンプルはtry catchを使用するための良いサンプルですか?サジェストは何ですか?

私はwindowserviceを持って、それはこのようないくつかの方法があります。

はこの悪いサンプルですか?

public void BeginOperation() 
    {  
    try 
    { 
      DoSync(); 
    }  
    catch (Exception x){ 
      Log(x.message) 
      Show(x.message); 
    } 
    } 


public void DoSync() 
    {  
    try 
    { 
     GetSampleDatatable(); 
     ApplyDiff(); 
     CommitDiff(); 
    }  
    catch (Exception x){ 
     Log(x.message) 
     throw x; 
    } 
    } 

DataLayerサンプル

public DataTable GetSampleDatatable() 
    {  
     OracleDataTable myDataTable; 
     try 
     { 
      myDataTable = new OracleDataTable(sqlStr, this); 
      myDataTable.FetchAll = true; 
      myDataTable.Active = true; 
     } 
     catch (Exception x) 
     { 
      this.ErrorMessage = x.Message; 
      throw x; 
     } 
     return myDataTable; 
    } 
+1

ここで最も大きな問題は、「例外をキャッチ」するだけで常にすべての例外をキャッチしていることです。どんな例外が起こったのか正確に考えてみてください。それでは、どのサンプルを捕まえるべきかが明らかになります。 – Andrei

+0

このサンプルの例外処理は何ですか、それについてすぐに教えてください。 – Mennan

+1

'スローx; 'それはあなたのスタックトレースを混乱させます!ちょうど '投げ; 'を使ってください。重要な点は次のとおりです。それに対処できるときにのみ例外をキャッチします*。問題を処理できない場合は、問題を処理しないでください。できるだけ泡立たせましょう。 – mason

答えて

1

いいえ、これは良い習慣ではありません。あなたは、例外をキャッチするかもしれないいくつかの理由があります:

  1. は、あなたはそれを処理し、
  2. まであなたが例外に追加の詳細を追加し、それがバブルせたい
  3. の進め方についての決定のいくつかの並べ替えを行うことができます
  4. 何かが失敗した場合、それは問題ではありません(これは非常にまれで、あなたはおそらく、少なくともそれを記録したい)

だからあなたの最初のコードブロック....

public void BeginOperation() 
{  
    try 
    { 
     DoSync(); 
    }  
    catch (Exception x) 
    { 
     Log(x.message) 
     Show(x.message); 
    } 
} 

public void DoSync() 
{  
    try 
    { 
     GetSampleDatatable(); 
     ApplyDiff(); 
     CommitDiff(); 
    }  
    catch (Exception x) 
    { 
     Log(x.message); 
     throw x; 
    } 
} 
を210

DoSyncは、これらのカテゴリに該当しません。あなたはエラーをログに記録していますが、BeginOperationも同様にログに記録されるので、冗長ログが得られます。書き換えは、それは次のようにする必要があります:実際に

public void BeginOperation() 
{  
    try 
    { 
     DoSync(); 
    }  
    catch (Exception x) 
    { 
     Log(x.message); 
     Show(x.message); 
    } 
} 

public void DoSync() 
{  
    GetSampleDatatable(); 
    ApplyDiff(); 
    CommitDiff(); 
} 

、私はあなたがこれをさらに簡素化することができ、DoSyncは全く必要であるかどうかを疑問視。しかし、おそらく組織的な理由があるかもしれません。

public void BeginOperation() 
{  
    try 
    { 
     GetSampleDatatable(); 
     ApplyDiff(); 
     CommitDiff(); 
    }  
    catch (Exception x) 
    { 
     Log(x.message) 
     Show(x.message); 
    } 
} 

ここでデータレイヤーです。もう一度、ここにいくつかの問題があります。あなたは例外をキャッチしていますが、ここでそれを処理することはできません。それをつかむことに意味がなかった。単にエラーのバブルをどこかで処理できるようにしてください(BeginOperation)。

public DataTable GetSampleDatatable() 
{  
    OracleDataTable myDataTable = new OracleDataTable(sqlStr, this); 
    myDataTable.FetchAll = true; 
    myDataTable.Active = true; 
    return myDataTable; 
} 

さらに、throw ex;を使用しています。これは良いパターンではありません。スタックトレース情報が失われ、IDEでどこから例外が発生したかを迅速に判断することが難しくなります。単にthrow;を使用すると、スタックトレース情報が保持されます。もちろん、上記の3つの理由で例外を捕捉しているだけの場合は、あまり頻繁に起こらないようにしてください。

+0

お返事のための@masonさん – Mennan

関連する問題