2012-01-12 9 views
-1

明確にするための変更:C# - 例外ログと返品状況

例外ログと正常終了に関する質問があります。これは以前のquestionと続きます。方法1内部

string status = "0"; 
ClassA ObjA = new ClassA(); 

try 
{ 
    status = objA.Method1(); 
    if (status != "-1") 
    {       
     status = objA.Method1(); 
    } 
} 
catch (Exception Ex) 
{ 
    //Log Exception EX 
} 

:コードは次のようになります

public string Method1() 
{ 
    string status = "0"; 
    try 
    { 
     //Code 
     return "0"; 
    } 
    catch (Exception Ex) 
    { 
     //Log Exception with details 
     return "-1" 
    } 
} 

私は、呼び出し元のメソッドにExceptionを記録し、呼び出し側にのみステータスを返します。 Exceptionを呼び出しメソッドに返すか、十分なステータスにする必要があります。 "-1"の状態では、呼び出されたメソッドにExceptionがあり、その詳細がログファイルに記録されていることがわかりました。

+0

"ベストプラクティス":どのような目的ですか? – Richard

+0

メソッドの呼び出しに例外を返す必要がありますか、ステータスだけで十分ですか。 -1の状態では、私は呼び出されたメソッドの例外とログファイルに記録された例外の詳細を知っています。 – Siva

+1

コードレビューを検討しましたか:http://codereview.stackexchange.com/? – mbanzon

答えて

1

status戻り値を使用しないでください。それはあなたにとって有用なものを追加するものではありません。

検討し、

var a = new ClassA() 
try 
{ 
    a.Mehtod1(); 
} 
catch 
{ 
    try 
    { 
     a.Method1(); 
    } 
    catch (Exception ex) 
    { 
     //Log without details; 
    } 
} 

class ClassA 
{ 
    void Method1() 
    { 
     try 
     { 
      //Code 
     } 
     catch (Exception ex) 
     { 
      //Log with details 
      throw; 
     }    
    } 
} 

このコードは、同じ機能を達成するが役に立つと非例外的な何かのための関数の戻りコードを残します。

もっと一般的には、ロギングを処理するアプリケーションのトップレベルに1つのキャッチオールハンドラを設定するか、公開エントリポイントごとに最大1つのキャッチオールハンドラを設定することをお勧めします。他のハンドラは、実際に処理できる特定の例外タイプを処理する必要があります(何かについては、何かをしてください)。

2

ステータスコードが大量にある場合は、そうすることをお勧めします。それ以外の場合は、例外をスローしてメソッドの上位にキャッチすることもできます。

返品のタイプも再考してください。あなたは整数を使用することができるように見える、あなたが文字列を使用してエラーまで自分自身を開いていると思う。

1

すべてはコードの目的と実装に依存します。例外が呼び出し元に返されるようにする方がよい場合もあります。exceptional casesで使用する必要があります。

ただし、リターンコードを使用する場合は、enumを使用する傾向があります(ただし、コードの目的によって異なります)。こうすることで、呼び出し側が使用可能なリターンコードの選択と照合するのは簡単です。また、整数や文字列をエラーコードとして使用する際のコメント - 呼び出し元がその問題の内容を把握していない可能性があります。この場合、Exceptionまたは特定のタイプ(エラーメッセージを含む)を投げるか、あらかじめ定義されたenumをわかりやすい名前で返すことは、呼び出し側にとってより意味があります。

1

何もしない短いコードスニペットから、何がベストプラクティスなのかを言うのは非常に難しいです。

一般に、例外を最も適切に処理する場所に例外をプッシュすることをお勧めします。もしあなたがいくつかのwebserviceとのインタフェースのためのフレームワークを書いているのであれば、フレームワークのユーザはネットワーク例外などを気にすることはほとんどありません - リターンコードが必要です。

1

フム - あなたの状況で私はむしろ、次の操作を行いたいが、それは本当に、状況によって異なります。

public string Method1() 
{ 
    string status = "0"; 

    //Code - Exception may be thrown 
    return "0"; 
} 

string status = "0"; 
ClassA ObjA = new ClassA(); 
try 
{ 
    status = objA.Method1(); 
} 
Catch(Exception Ex) 
{ 
    //Log Exception EX 
    status = "-1; 
} 

EDIT
は、時にはそれはエラーが中に発生したかどうかを示す値を定義するのは難しいですメソッド。 Nullableタイプを念頭に置いてください。エラーを示す適切な戻り値を見つけることができれば、エラーの原因となったメソッド内でエラーを記録し、示唆したとおりに戻り値に反応することもできます。

ところで、コードでは、最初の呼び出しが成功した場合はMethod1を2回呼び出しています。私はそれがクイックサンプルであるためだと思います...

+0

答えをありがとう。これはサービスを呼び出すためのものです。そのツールのために、しかし、私はよりクリーンでより良いコードにすることを学ぶでしょう。 – Siva

1
class MyException : Exception 
{ 
    public readonly int status; 
    public MyException(int status, string msg):base(msg) 
    { 
     this.status = status; 
    } 
} 

public string Method1() 
{ 
    throw new MyException(-1,"msg"); 
    return "0"; 
} 




SomeCode() 
    { 

     try 
     { 
        Method1(); 
     }catch(MyException ex) 
     { 
      ex.status //here you get the status 
      } 
    } 
関連する問題