7

次のコードを実行しようとしています。

class Program
{
    static void Main(string[] args)
    {
        var task = Task.Factory.StartNew(() =>
            {
                throw new ApplicationException("message");
            });
        try
        {
            task.ContinueWith(t => Console.WriteLine("End"));
        }
        catch (AggregateException aex)
        {
            Console.Write(aex.InnerException.Message);
        }
    }
}

Exceptionが次の場所でキャッチされると予想しました。

        catch (AggregateException aex)
        {
            Console.Write(aex.InnerException.Message);
        }

しかし、これは起こっていません。これはなぜですか?

4

5 に答える 5

10

- を印刷しているだけで、taskまだ完了していません。

タスクの出力は、タスクが完了するのを待たず、値をフェッチしようとしません。

コードを次のように変更した場合:

try
{
    task.Wait();
}

...そして、例外をキャッチすることを期待しています。

(以前は を使用してTask<T>.Resultいましたが、これは戻り値のないタスクであることがわかりました。そのため、非ジェネリックになりTaskます。)

于 2013-05-14T17:08:28.790 に答える
1

この方法Taskでは、渡したデリゲートを呼び出すコードがStartNew最終的にキャッチExceptionされ、タスクのインスタンス フィールドに格納されます。その例外は、プロパティを調べることで調べることができtask.Exceptionます。回線は内部的Console.WriteLine(task)に呼び出しているだけです。task.ToStringそのメソッドでは、例外がスローまたは再スローされることはありません。

ただし、特定の状況では、キャッチされた例外が再スローされます。2 つの例は、 にアクセスResultして呼び出す場合と、C# 5.0 でタスクを実行するWait場合です。await

次のコード:

try
{
    task.Wait();
}
catch (AggregateException aex)
{
    Console.Write(aex.InnerException.Message);
}

保存された例外が再スローされ、例外メッセージが出力されます。

于 2013-05-14T17:10:23.533 に答える
-2

AggregateException と ApplicationException は、どちらも同じクラス System.Exception の子です。AggregateExceptionApplicationExceptionではありません

于 2013-05-14T17:14:14.043 に答える