私はExam Ref 70-483: Programming in C#本の例に取り組んでいますが、リスト 1-44 の次のコードで問題が発生しました。この例では、作成者は、継続タスクが継続元タスクでスローされた未処理の例外にアクセスできること、および適切な場合はそれらを処理できることを実証しようとしています。
static void Main(string[] args)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken token = cancellationTokenSource.Token;
Task task = Task.Run(() =>
{
while (!token.IsCancellationRequested)
{
Console.Write("*");
Thread.Sleep(1000);
}
throw new OperationCanceledException();
}, token).ContinueWith((t) =>
{
t.Exception.Handle((e) => true);
Console.WriteLine("You have canceled the task.");
}, TaskContinuationOptions.OnlyOnCanceled);
Console.WriteLine("Press enter to stop the task.");
Console.ReadLine();
cancellationTokenSource.Cancel();
task.Wait();
Console.WriteLine("Press enter to end the application.");
Console.ReadLine();
}
残念ながら、続きのこのコード行
t.Exception.Handle((e) => true);
t.Exception
であるために例外をスローしますnull
。
t.Status
その行にブレークポイントを設定するとCanceled
、 ではなくであることがわかりますFaulted
。これが例外が利用できない理由ですか?前件タスクでスローされた例外を処理する正しい方法は何ですか?