4

次のコード スニペットを検討してください。

foreach (var setting in RequiredSettings)
                {
                    try
                    {
                        if (!BankSettings.Contains(setting))
                        {
                            throw new Exception("Setting " + setting + " is required.");
                        }
                    }
                    catch (Exception e)
                    {
                        catExceptions.Add(e);
                    }
                }
            }
            if (catExceptions.Any())
            {
                throw new AggregateException(catExceptions);
            }
        }
        catch (Exception e)
        {
            BankSettingExceptions.Add(e);
        }

        if (BankSettingExceptions.Any())
        {
            throw new AggregateException(BankSettingExceptions);
        }

catExceptions は、私が追加する例外のリストです。ループが完了したら、そのリストを取得して AggregateException に追加し、それをスローします。デバッガーを実行すると、「Setting X is required」という文字列メッセージがそれぞれ catExceptions コレクションに表示されます。ただし、AggregateException になると、メッセージは「1 つ以上のエラーが発生しました」だけになりました。

個々のメッセージを保持しながら集約できる方法はありますか?

ありがとう!

4

2 に答える 2

5

個々のメッセージを保持しながら集約できる方法はありますか?

はい。InnerExceptionsプロパティには、すべての例外とそのメッセージが含まれます

必要に応じてこれらを表示できます。例えば:

try
{
    SomethingBad();
}
catch(AggregateException ae)
{
    foreach(var e in ae.InnerExceptions)
       Console.WriteLine(e.Message);
}
于 2012-06-13T20:38:20.897 に答える
2

上記のポスターは正しい答えを出していますが、 foreach ループを使用するのではなく、.handle()メソッドを使用できます。

try
{
    SomethingBad();
}
catch(AggregateException ae)
{
    ae.handle(x => {
        Console.WriteLine(x.Message);
        return true;
    });
}
于 2012-06-14T15:47:54.230 に答える