質問

私のクラスには次のコードがあります。このクラスの目的は、Webサーバーからバランスを取得することです。バランスをとることで何かがうまくいかない場合のために例外を処理します。ただし、これはすべて簡単です。しかし、catchステートメントで何を返すのか疑問に思っています。

私が見た例のほとんどは、次のものを使用してコンソールに書き込むだけです。

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");
        }

現在の私の関数はvoidを返します。そして、ウェブクライアントがビジーの場合、他に何を返すのだろうかと思っていますか?

アドバイスをありがとう、

役に立ちましたか?

解決

例外を処理できない場合、例外をキャッチしません。一部の値のみを返す場合、呼び出しメソッドは、値が実際の結果であるか、例外の単なるインジケータであるかを確認する必要があります。そして今、このメソッドは何をして返すかを決定しなければなりません。そして、このメソッドを呼び出すメソッド。そしてメソッド...

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

何かを記録する場合は、次のパターンを使用して例外を記録し、例外を再スローします。

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

   throw;
}

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

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

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

   throw;
}

他のヒント

ex.ToString()メソッドを使用する必要があります

  

Exception.Message   例外の簡単な説明が含まれています(例:「"オブジェクト参照が設定されていません..."」。

     

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

.NETでの例外処理のベストプラクティス

クライアントがビジーの場合、メソッドを再実行できますが、再試行する前に一定時間待機しますか? xの再試行後に失敗する可能性があります。

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

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

パターンからの例外ブロック&プラクティス

例外の表示のみに関心がある場合は、例外を再度スローして、例外の処理を計画している人が引き続き例外を取得するようにしてください。

未処理の例外をマスクしたくないことは確かです。スタックをバブルアップさせます。しかし、Webクライアントが忙しい場合に何を返すかを尋ねている場合、 ランダムな間隔、または関数の呼び出し元が残高を再度ダウンロードする前に待機する必要のある有意な間隔を返しますか?乱数は負荷を分散させるか、そうでなければ衝突の問題を緩和する可能性があります。サーバーの現在の状態に基づいて、より意味のある間隔を送り返すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top