我已经获得了以下代码:
private static void Main()
{
AsyncMain().Wait();
}
private static async Task AsyncMain()
{
throw new Exception("Panic!");
}
在此,异常最终会在Wait()的调试器中显示为聚合异常。如何让它出现在引发异常的地方?
答案 0 :(得分:0)
所有异步异常都被“捆绑”并以AggregateException
方式抛出。您的原始异常只是AggregateException
的内部异常。您可以执行以下操作来处理它:
private static void Main()
{
try
{
AsyncMain().Wait();
}
catch (AggregateException aggEx)
{
foreach (Exception ex in taskEx.InnerExceptions)
{
// Handle your original exception here.
}
}
}
AggregateException
引发Wait
的原因是因为只有在观察到时才会捕获异常!这一点很重要,因为如果您在上面的示例中没有使用Wait
,则永远不会发生异常。
如果您需要在AsyncMain
中捕获异常,请使用try / catch将其包围,在方法中处理它,否则将始终在观察它的时间和地点抛出它。
如果您有空闲时间,请阅读Sacha Barber's article series on TPL。绝对精彩。他非常好地解释了这些概念!