加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我想等待抛出AggregateException,而不仅仅是第一个异常

发布时间:2020-12-15 03:47:04 所属栏目:百科 来源:网络整理
导读:等待有故障的任务(有异常设置的任务),等待将重新抛出存储的异常.如果存储的异常是AggregateException,它将重新抛出第一个异常并丢弃其余的异常. 我们如何使用等待并同时抛出原始的AggregateException,以免我们不会意外丢失错误信息? 请注意,当然有可能想到
等待有故障的任务(有异常设置的任务),等待将重新抛出存储的异常.如果存储的异常是AggregateException,它将重新抛出第一个异常并丢弃其余的异常.

我们如何使用等待并同时抛出原始的AggregateException,以免我们不会意外丢失错误信息?

请注意,当然有可能想到这样的hacky解决方案(例如try-catch在等待,然后调用Task.Wait).我真的希望找到一个干净的解决方案.这里最好的做法是什么?

我想到使用一个定制的等待者,但内置的TaskAwaiter包含了很多魔术,我不知道如何完全复制.它在TPL类型上调用内部API.我也不想复制所有这一切.

如果你想玩这个,这是一个简短的重现:

static void Main()
{
    Run().Wait();
}

static async Task Run()
{
    Task[] tasks = new[] { CreateTask("ex1"),CreateTask("ex2") };
    await Task.WhenAll(tasks);
}

static Task CreateTask(string message)
{
    return Task.Factory.StartNew(() => { throw new Exception(message); });
}

Run中只抛出两个异常之一.

请注意,Stack Overflow上的其他问题不能解决这个具体问题.建议重复时请小心.

解决方法

我不同意你的问题标题的暗示,等待行为是不合需要的.绝大多数场景都是有意义的.在所有情况下,您真的需要多长时间了解所有错误的详细信息,而不是仅仅一个?

AggregateException的主要困难是异常处理,即您无法捕获特定类型.

也就是说,使用扩展方法获取所需的行为很容易:

public static async Task WithAggregateException(this Task source)
{
    try
    {
        await source.ConfigureAwait(false);
    }
    catch
    {
        throw source.Exception;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读