1. ホーム
  2. c#

[解決済み] try catchブロックのネストを回避するパターン?

2022-05-17 14:50:06

質問

ある計算を実行するための3つ(またはそれ以上)の方法があり、それぞれが例外で失敗する可能性があるという状況を考えてみましょう。成功するものを見つけるまでそれぞれの計算を試みるために、私は次のようにしています。

double val;

try { val = calc1(); }
catch (Calc1Exception e1)
{ 
    try { val = calc2(); }
    catch (Calc2Exception e2)
    {
        try { val = calc3(); }
        catch (Calc3Exception e3)
        {
            throw new NoCalcsWorkedException();
        }
    }
}

より良い方法でこれを実現する、受け入れられるパターンはあるのでしょうか?もちろん、それぞれの計算をヘルパーメソッドでラップして、失敗したらnullを返すようにすることはできますし、単に ?? 演算子を使えばいいのですが、もっと一般的に(つまり、使いたいメソッドごとにヘルパーメソッドを書かなくても)これを実現する方法はないでしょうか?私は、任意のメソッドをtry/catchでラップし、失敗時にnullを返すジェネリックスを使用した静的メソッドを書くことを考えましたが、私はこれをどのように行うかわかりません。何かアイデアはありますか?

どのように解決するのですか?

制御フローや例外的な状況には、できるだけ例外を使用しない。

しかし、あなたの質問に直接答えるならば、(すべての例外型が同じであると仮定して)。

Func<double>[] calcs = { calc1, calc2, calc3 };

foreach(var calc in calcs)
{
   try { return calc(); }
   catch (CalcException){  }
} 

throw new NoCalcsWorkedException();