如何防止.Wait()破坏异常?

时间:2015-02-10 05:21:28

标签: c# async-await .net-4.5

我已经获得了以下代码:

private static void Main()
{
    AsyncMain().Wait();
}

private static async Task AsyncMain()
{
    throw new Exception("Panic!");
}

在此,异常最终会在Wait()的调试器中显示为聚合异常。如何让它出现在引发异常的地方?

1 个答案:

答案 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。绝对精彩。他非常好地解释了这些概念!