この例外再試行シナリオを改善するにはどうすればよいですか? 質問する

この例外再試行シナリオを改善するにはどうすればよいですか? 質問する

私が呼び出している Web サービス メソッドは、サード パーティ製で、私のドメイン外にあります。何らかの理由で、Web サービスがゲートウェイ タイムアウトで失敗することがあります。これは断続的に発生し、失敗した試行の直後に呼び出すと成功することもあります。

今、私はコーディングのジレンマに陥っています。うまくいくはずのコードはありますが、以下に示すように、そのコードは素人レベルの出来です。

これは本当に悪いコードでしょうか、それとも使用方法を考慮すると許容できるものなのでしょうか? 許容できない場合は、どのように改善すればよいでしょうか?

ぜひ真顔で見てみてください。

try
{
    MDO = OperationsWebService.MessageDownload(MI);
}
catch
{
    try
    {
        MDO = OperationsWebService.MessageDownload(MI);
    }
    catch
    {
        try
        {
            MDO = OperationsWebService.MessageDownload(MI);
        }
        catch
        {
            try
            {
                MDO = OperationsWebService.MessageDownload(MI);
            }
            catch 
            {
                try
                {
                    MDO = OperationsWebService.MessageDownload(MI);
                }
                catch (Exception ex)
                {
                    // 5 retries, ok now log and deal with the error.
                }
            }
        }
    }
}

ベストアンサー1

ループで実行できます。

Exception firstEx = null;
for(int i=0; i<5; i++) 
{
    try
    {
        MDO = OperationsWebService.MessageDownload(MI);
        firstEx = null;
        break; 
    }
    catch(Exception ex)
    {
        if (firstEx == null) 
        {
            firstEx = ex;
        }
        Thread.Sleep(100 * (i + 1));
    }
}
if (firstEx != null) 
{
    throw new Exception("WebService call failed after 5 retries.", firstEx);
}

おすすめ記事