2009-04-29 9 views
1

私はクラスの中に次のコードを持っています。このクラスの目的は、Webサーバーからバランスを取ることです。ちょっとしたことで、バランスを取るのに間違ってしまう場合があります。私は例外を処理します。しかし、これはすべて簡単です。しかし、私はcatch文で何を返すのか不思議に思っています。C#例外ハンドルから何かを返す

私が見て例のほとんどは、単に使用して、コンソールに書き込む:すべての非常によくある

Console.WriteLine(ex.Message); 

を。しかし、実際のアプリケーションでは、ほとんどの開発者は何をしていますか?

//Download only when the webclient is not busy. 
     if (!wc.IsBusy) 
     { 
      // Sleep for 1/2 second to give the server time to update the balance. 
      System.Threading.Thread.Sleep(500); 

      try 
      { 
       // Download the current balance. 
       wc.DownloadStringAsync(new Uri(strURL)); 
      } 
      catch (WebException ex) 
      { 
       Console.Write("GetBalance(): " + ex.Message); 
      } 
     } 
     else 
     { 
      Console.Write("Busy please try again"); 
     } 

私の現在の機能は、無効を返します。そして、私は、Webクライアントがビジー状態なら何が返ってくるのだろうかと思っています。

何かアドバイスのための多くのおかげで、

答えて

14

あなたはそれを扱うことができない場合に例外をキャッチしないでください。ちょうどある値を返す場合、呼び出しメソッドは、値が実際の結果か例外の指標かどうかをチェックする必要があります。そして今、このメソッドは何をして返すのかを決める必要があります。このメソッドを呼び出すメソッド。そしてその方法...

例外をバブルアップして、どこかでそれを扱うことができます。ユーザーインターフェイスのすぐ下にある可能性があり、ユーザーが問題の解決方法を再試行または情報を表示するかどうかを尋ねるメッセージボックスを表示します。ユーザーインターフェイスがない場合は、問題を解決できる場所にキャッチして再試行してください。一時的な問題の場合は、呼び出しが成功するまで、妥当なレベルでタスク全体を再試行してください。

ログに記録する場合は、次のパターンを使用して例外をログに記録し直してください。

try 
{ 
    DoStuff(); 
} 
catch (Exception exception) 
{ 
    Log(exception.ToString()); 

    throw; 
} 

それはthrow;ないthrow exception;であることに注意してください。後で行う場合は、元のスタックトレースが失われます。例外の原因について詳細を推測できる場合は、キャッチされた例外を、より意味のある例外に包括して追加情報を付ける必要があります。

try 
{ 
    DoStuff(); 
} 
catch (SpecificMeaninglessException exception) 
{ 
    Log(exception.ToString()); 

    throw new MeaningfulException("Details about the error.", exception); 
} 
catch (Exception exception) 
{ 
    Log(exception.ToString()); 

    throw; 
} 
1

あなたは、クライアントがビジー状態の場合の方法を再実行しますが、再試行する前に一定の時間を待つことができますか? x回の再試行後に障害が発生する可能性があります。

代わりに、単に問題をログに記録したい場合、catchステートメントは例外をファイルベースのログ、イベントビューア、データベースに送信、アラート(電子メール、SMSなど)を記録することができます。これは必要である。

+0

各メソッドで遅延と再試行のループが実装されている場合は、それらを3回ネストし、再試行回数を3倍にしました。それをするのは危険です。 –

3

あなたはException.Message (例えば、 "オブジェクト参照が設定されていません...")例外の簡単な説明が含まれex.ToString()メソッド

を使用する必要があります。

Exception.ToString() には、例外の説明と完全なスタックトレースが含まれています。

Exception Handling Best Practices in .NET

1

例外の重大さによって異なります。

あなたはそう、今までは、それはまだそれを取得します取扱いを計画している例外をスローし直す必要がある例外を見ることにだけ興味があるなら、私はThe Exception Block from Patterns & Practices

1

に探してお勧めします。

1

あなたは確かに未処理の例外をマスクしたくありません。その泡を積み重ねてください。しかし、ウェブクライアントがちょうどビジー状態であれば何を返すべきかを尋ねる場合、 は、関数呼び出し者が残高を再度ダウンロードしようとするまで待つべきランダムな間隔かいくつかの意味のある間隔を返しますか?乱数は、負荷を分散させるか、そうでなければ衝突問題を緩和することができる。サーバーの現在の状態に基づいて、より意味のある間隔を返すことができます。

関連する問題