この回答からわずかに変更されたコードを再利用し、 @ svickのアドバイスを実装するためにコードを変更する方法:
ただし、Task を変数に保存して task.Exception.Flatten() を呼び出すと、両方の例外が返されます。
?
//C# console app
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
async static Task Test()
{
Task containingTask, nullRefTask, argTask;
try
{
containingTask = Task.Factory.StartNew
(() =>
{
nullRefTask = Task.Factory.StartNew(() =>
{
throw new NullReferenceException();
}
, TaskCreationOptions.AttachedToParent);
argTask = Task.Factory.StartNew(() =>
{
throw new ArgumentException();
}
, TaskCreationOptions.AttachedToParent);
}
);
await containingTask;
foreach(Exception ex in containingTask.Exception
.Flatten().InnerExceptions)
//Possible 'System.NullReferenceException'
{ //never entered
Console.WriteLine("@@@@@"+ex.GetType().Name);
}
}//try
catch (AggregateException ex)
{
Console.WriteLine("** {0} **", ex.GetType().Name);
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine("$$$$$$"+exc.GetType().Name);
}
//foreach (Exception exxx in containingTask.Exception.Flatten().InnerExceptions)
//Use of unassigned local variable 'containingTask'
}
//foreach (Exception exxx in containingTask.Exception.Flatten().InnerExceptions)
////Use of unassigned local variable 'containingTask'
}
}
containingTask.Exception.Flatten().InnerExceptions
try-/catch-blocks を使用して、または使用せずにアクセスしようとすると、 try
-、- catch
blocks の内外でエラーが発生します。
Use of unassigned local variable 'containingTask'
また
Possible 'System.NullReferenceException'
両方の子タスクから両方の例外を表示/取得する方法は?
アップデート:
タイプミスを修正した後、コードが期待される結果を生成するため、この部分は質問から削除されました
バリアント #2 (C# コンソール アプリ): 「非同期 - 複数の例外の処理」
の「回避策」を再現して、すべての子タスクからのすべての例外を確認 しようとしています。
class Program
{
static void Main(string[] args)
{
Tst();
Console.ReadLine();
}
async static Task Tst()
{
try
{
Task t= Task.Factory.StartNew
(
() =>
{
Task.Factory.StartNew
(
() =>
{ throw new NullReferenceException(); }
,TaskCreationOptions.AttachedToParent
);
Task.Factory.StartNew
(
() =>
{ throw new ArgumentException(); }
, TaskCreationOptions.AttachedToParent
);
}
);
await t.ContinueWith
(
tsk =>
{
if (tsk.Exception != null)
throw tsk.Exception;
}
);
}
catch (AggregateException ex)
{
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine("** {0} **", exc.GetType().Name);
}
}
catch (Exception ex)
{
Console.WriteLine("## {0} ##", ex.GetType().Name);
}
}
}