는 더 나은 TPL에서 예외와 오류 처리의 근거를 파악하기 위해 고군분투 (및 .NET 4.5에서 좀 더 운 비동기/기다리고 작업) 약간 내 이전 질문 "How to better understand the code/statements from "Async - Handling multiple Exceptions" article?" C# 콘솔 응용 프로그램 코드 2를 실행하위 작업의 많은 예외 중 하나만 전파됩니까?
수정 (: 다른에 의해, 미안 하나 개의 질문을 시작했지만 결국 업데이트!) 작업 : 은 내부 중첩 된 부착 (종속)의 아이를 분리
class Program
{
static void Main(string[] args)
{ Tst();
Console.ReadLine();
}
async static Task Tst()
{
try
{
await Task.Factory.StartNew
(() =>
{
Task.Factory.StartNew
( () => {
Console.WriteLine("From 1st child");
throw new NullReferenceException();
}
, TaskCreationOptions.AttachedToParent
);
Task.Factory.StartNew
(() =>
{
Console.WriteLine("From 2nd child");
throw new ArgumentException();
}
,TaskCreationOptions.AttachedToParent
);
}
);
}
catch (AggregateException ex)
{
Console.WriteLine("** {0} **", ex.GetType().Name);
foreach (var exc in ex.Flatten().InnerExceptions)
{
Console.WriteLine(exc.GetType().Name);
}
}
catch (Exception ex)
{
Console.WriteLine("## {0} ##", ex.GetType().Name);
}
}
는 출력을 생성하는 번갈아 (비 결정적) :
From 1st child
From 2nd child
** AggregateException **
ArgumentException
및
From 1t child
From 2nd child
** AggregateException **
NullReferenceException
은 언제나처럼 보인다 항상/전파 잡은 자식 작업 중 하나에서 단 하나 개의 예외입니다.
예외가 전파되는 이유는 무엇입니까?
하위 작업의 예외가 전혀 없거나 모든 예외가 항상 잡히면 더 잘 이해할 수 있습니다.
예외적으로 두 가지 예외가 발생할 수 있습니까?
이 문제의 추론에 대한 자세한 내용은 Stephen Toub의 기사 [*. NET 4.5 *에서의 작업 예외 처리] (http://blogs.msdn.com/b/pfxteam/archive/2011/)의 후반부를 참조하십시오. 09/28/10217876.aspx). – svick