OCN 検索

最近の記事

Powered by Blogzine[ブログ人]

« Taskを使って非同期処理 2:処理結果を受け取る | メイン | リストから2個とりだす組み合わせを作ってみる »

2012/04/01

Taskを使って非同期処理 3:例外をキャッチする

 非同期処理中に発生した例外はAggregateExceptionという形でスローされます。
 この例外はWaitメソッドを呼んだ際にスローされます。
 AggregateExceptionインスタンスのInnerExceptionsプロパティに処置中にスローされた例外が格納されています。
 以下のサンプルコードでは処理中にわざと例外を発生させています。

---- C# ---------------------------------------------------------------------
using System.Threading.Tasks;

var task = Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 5; i++)
    {
        if (i == 3)
        {
            // 適当に例外を発生させる
            throw new TimeoutException("例外発生");
        }

        Console.WriteLine("処理{0}", i);
    }
});

try
{
    // Waitメソッドが実行された際に例外がスローされる
    task.Wait();
}
catch (AggregateException ex) // Taskの例外はAggregateException
{
    // 実際にスローされた例外の情報はInnerExceptionsに格納されている
    foreach (var innerEx in ex.InnerExceptions)
    {
        Console.WriteLine("{0}:{1}", innerEx.GetType(), innerEx.Message);
    }
}

Console.WriteLine("終了");
Console.ReadLine();
-------------------------------------------------------------------
 このサンプルコードではi == 3の時にTimeoutExceptionをスローしています。
 Taskの処理内の例外なので、この例外はAggregateExceptionのInnerExceptionsに格納され、Waitメソッドを呼んだ際にスローされます。

 結果は以下のようになります。
  Task_2

 

次回は非同期処理のキャンセルについて説明する予定です。

コメント

コメントを投稿

2013年10月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Amazon