私はprogram.csでいくつかの "グローバル"例外処理を設定したWinForm非同期GUIアプリケーションを持っています。私はまた、 "待っているTask.WhenAll()"を実行し、その例外をキャッチし、待っているTask.Exceptionプロパティを投げるGUIスレッドを持っているので、AggregateExceptionはprogram.cs内の例外ハンドラに至るまで得られる(私はしたい内側の例外を反復処理してログに記録する)。GUIスレッドからスローされたAggregateExceptionがアプリ例外ハンドラで「アンラップ」するのはなぜですか?
WhenAll()のtry/catchからスローされた例外が実際にAggreateExceptionをスローしているのがわかりますが、program.csのハンドラをデバッグするとAggregateExceptionはもうありません。 AggregateExceptionの例外。私はこのコードを「アンラッピング」しているのか分かりません。
のProgram.cs:Form1.csの
private async void button1_Click(object sender, EventArgs e) {
Task overall = Task.WhenAll(
Task.Run(()=> { throw new ApplicationException("message 1"); }),
Task.Run(() => { throw new ApplicationException("message 2"); })
);
try {
await overall;
}
catch {
throw overall.Exception; // this is AggregateException
}
}
}
グローバル例外処理をキャッチされない例外のためにそこにあることを。あなたが*例外*を期待するならば、それが捕らえられないようにしてください。いずれにせよ、私はあなたが望むなら、あなた自身の例外で 'AggregateException'をラップすることができると思います。 – Luaan
@MichaelRayLovett:再現性のある最小限の例を投稿できますか? –
AggregateExceptionをスローする理由はありません。その例外は、非同期メソッド内で発生した1つ以上の例外に対するラッパーです。 'await' *は最初の内部例外を返します。私はそこに 'waitAll();'があると思って、最初の例外がUIスレッドで再スクロールされるのを疑う。 –