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メソッドを呼んだ際にスローされます。
次回は非同期処理のキャンセルについて説明する予定です。
コメント