0

このコードはBackgroundWorkerのDoWorkイベントハンドラーで呼び出されます。WCFクライアントを作成し、tryブロックで使用しています。例外がある場合は、ハンドラーから戻る前に5回中止して再試行します。

    private void WorkerDoWork(object sender, DoWorkEventArgs e)
    {            
        var mmc = new ServiceClient();

        try
        {
            e.Result = mmc.SubmitData(measure);
        }
        catch (Exception)
        {
            mmc.Abort();

            mmc = new ServiceClient();

            var counter = 0;

            while ((bool)e.Result == false && counter++ < 5)
            {
                try
                {
                    e.Result = mmc.SubmitData(measure);
                }
                catch (Exception)
                {
                    mmc.Abort();
                    mmc = new ServiceClient();
                }
            }
        }
        finally
        {
            if (mmc.State == CommunicationState.Faulted)
            {
                mmc.Abort();
            }
            else
            {
                mmc.Close();
            }
        }
     }

私はコードに本当に満足していません、何かがそれで怪しいように感じます!特にネストされたtry/catch。

このコードは大丈夫ですか?または、リファクタリングする必要がありますか?

4

1 に答える 1

2

はい、盲目的に Web サービスを叩くことが問題であることに同意します。

どのような例外を処理できるかを知っておくとよいでしょう。

これは、データ形式、タイプ、制限、制限、認証の失敗、アカウント使用制限のヒット、何でも!

しかし、再試行で修正されるようにすべてが処理され、修正されない場合は壊れています。

発生した問題について報告してみてはどうでしょうか。

優れたプログラマーとして、どの状況でどの例外がスローされるかを調べ、可能であれば適切な方法でそれらを処理する必要があります。
それらを処理できない場合は、ロギングまたはユーザーに報告してください (対話型の場合)。

于 2012-07-31T09:55:54.317 に答える