5

TPL タスクで例外を処理するとき、例外を処理する 2 つの方法に遭遇しました。1 つ目は、タスク内で例外をキャッチし、次のように結果内で返します。

var task = Task<Exception>.Factory.StartNew(
    () =>
        {
            try
            {
                // Do Something

                return null;
            }
            catch (System.Exception e)
            {
                return e;
            }
        });

task.ContinueWith(
    r =>
        {
            if (r.Result != null)
            {
                // Handle Exception
            }
        });

2番目はドキュメント内に示されているもので、適切な方法だと思います:

var task = Task.Factory.StartNew(
    () =>
        {
            // Do Something
        });
task.ContinueWith(
    r =>
        {
            if (r.Exception != null)
            {
                // Handle Aggregate Exception
                r.Exception.Handle(y => true);
            }
        });

最初のアプローチに何か問題があるかどうか疑問に思っていますか? この手法を使用して「未処理の集計例外」例外を時々受け取りましたが、これがどのように発生するのか疑問に思っていましたか?

明確にするために、2番目のパターンの方が良いと思いますが、最初のパターンを利用するコードのチャンクがあり、リファクタリングが必要かどうか、つまり、すべての例外がそうではないことが判明したかどうかを調べようとしています。閉じ込められた。

4

1 に答える 1

3

最初のアプローチは、呼び出しごとに例外が発生することを前提としています。これは本当かもしれませんが、例外は「例外的」ではなく、設計上の問題の匂いがします。例外が例外的でない場合、結果はあまり意味がありません。もう 1 つの問題は、「結果」(つまり、 以外のものException) が必要な場合、唯一のResultスロットがException. もう 1 つの問題は、メイン スレッドで例外の再スローを取得できない (手動で行うことができる) ため、catch セマンティクスを取得できない (つまり、Handleメソッドを使用している) ことです。

2 番目の方法は、より多くの人に理解されるでしょう。

于 2012-09-20T13:06:17.787 に答える