猿问

在调用异步代码时始终考虑 AggregateExceptions 中的多个异常是否有意义?

例如productUpdate.UpdateAsync(...),当调用异步代码时,它可能会抛出具有多个内部异常或只有一个异常的 AggregateException。这一切都取决于内部如何实现 UpdateAsync。


问题:由于await只解开 AggregateException 中异常列表中的第一个异常,下面的特殊代码试图规避它,但这很笨拙,理想情况下,在我调用某个外部库的异步代码的每个地方,可能有一个AggregateException 有多个异常。在所有这些地方都有这个有意义吗?(当然可能可以进入一个辅助方法,但这不是这里的重点)然后还有一个问题是我通过捕获这些异常做了什么有意义的事情。我认为它在所有地方都没有意义。你的想法?


var t1 = FooAsync();

var t2 = BarAsync();


var allTasks = Task.WhenAll(t1, t2);


try

{

    await allTasks;

}

catch (Exception)

{

    var aggEx = allTasks.Exception as AggregateException;

    // todo: do something with aggEx.InnerExceptions

}

更新:在此处为用户Dave添加了完整的重现代码以及运行它的结果:


using System;

using System.Threading.Tasks;


class Example

{

    static void Main()

    {

        BlahAsync().Wait();

    }


    static async Task BlahAsync()

    {

        var t1 = FooAsync(throwEx: true);

        var t2 = BarAsync(throwEx: true);


        var allTasks = Task.WhenAll(t1, t2);


        try

        {

            await allTasks;

        }

        catch (AggregateException agex)

        {

            Console.WriteLine("Caught an aggregate exception. Inner exception count: " + agex.InnerExceptions.Count);

        }

    }


    static async Task FooAsync(bool throwEx)

    {

        Console.WriteLine("FooAsync: some pre-await code here");


        if (throwEx)

        {

            throw new InvalidOperationException("Error from FooAsync");

        }


        await Task.Delay(1000);


        Console.WriteLine("FooAsync: some post-await code here");

    }


    static async Task BarAsync(bool throwEx)

    {

        Console.WriteLine("BarAsync: some pre-await code here");


        if (throwEx)

        {

            throw new InvalidOperationException("Error from BarAsync");

        }


        await Task.Delay(1000);


        Console.WriteLine("BarAsync: some post-await code here");

holdtom
浏览 177回答 1
1回答
随时随地看视频慕课网APP
我要回答