【C#】連続で処理が失敗した時に何度も同じような処理をしない

例えば定周期処理などで、エラーが出ても処理を継続するような場合に、最初の一回は例外処理を行うけど、処理が連続で失敗した場合2回目以降は、処理を行わないようにする実装パターンの紹介です。

この仕組みを使用して実装例ではログを何度も出力しないようにしています。

// 処理が最後まで進んだかどうかのフラグ
// true: 進んだ / false: それ以外
private static bool isDone = true;

public static void Foo()
{
    while (true)
    {
        try
        {
            Thread.Sleep(1000);

            // 何かの処理

            isDone = true;
        }
        catch (Exception ex)
        {
            if (isDone) // こうすることで何度も同じような出力にならないようにする
            {
                Trace.WriteLine(ex.ToString());
                isDone = false;
            }
        }
    }
}

isDone フラグは初期値および、処理が完了すると true となりますが、処理が完了するまでは変化しません。

  • 「何らかの処理」で例外が発生する
  • catch ブロックに飛ぶ
  • if (isDone ) に入ってログを出力する
  • isDone が false になる

で、次のループでまたエラーが発生した場合

  • 「何らかの処理」で例外が発生する
  • catch ブロックに飛ぶ
  • if (isDone ) に入らない → ログは出ない

となります。そして

  • 「何らかの処理」が成功する
  • isDone は true になる

となった場合、再度「何らかの処理」で例外が発生したら、上述の最初からやり直しになり、また最初に1回だけ処理が走って例外が出力されるようになります。