自定义异常作为聚合异常抛出

3
当从Task.Run(...).Result中抛出自定义异常时,catch块会找到AggregateException而不是CustomException。为什么?
   public MainPage()
    {
        this.InitializeComponent();
        CallAMethod();
    }

    static bool AMethod()
    {
        return Task.Run(() =>
        {
            throw new CustomException();
            return false;
        }).Result;
    }

    static bool CallAMethod()
    {
        try
        {
            return AMethod();

        }
        catch (CustomException e)
        {
            //not caught
            throw;
        }
        catch (Exception ex)
        {
            //caught?
            throw;
        }
    }

这里是自定义异常类

class CustomException : Exception
{

}

4
当你在一个已经失败的任务上使用Task.Wait()或Task.Result时,引起任务失败的异常会被传播出来,但它不会直接抛出。相反,它会被包装在一个AggregateException对象中,然后抛出。你可以通过访问它内部的CustomException来获取异常信息。参考链接提供了如何展开(Flattening)AggregateException以便处理其中嵌套的多个异常。 - Colin Smith
我相信你可以将这个作为答案添加,因为提问者将问题框定为“为什么?” - glopes
@colinsmith 感谢您的回答。我之前不知道 Exception.Flatten 这个方法,现在会使用它了。已发布答案。还需等待2天才能标记为答案。 - Bryan Stump
1个回答

9

来自@colinsmith

当你使用Task.Wait()或Task.Result等待一个失败的任务时,导致任务失败的异常会被传播,但它不会直接抛出...相反,它被包装在一个AggregateException对象中,然后被抛出。

请参见:处理AggregateExceptions的扁平化


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接