gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:06:01 26 4
gpt4 key购买 nike

在等待错误任务(设置了异常的任务)时,await 将重新抛出存储的异常。如果存储的异常是 AggregateException,它将重新抛出第一个并丢弃其余的。

我们如何使用await,同时抛出原始的AggregateException,这样我们才不会不小心丢失错误信息?

请注意,当然可以为此考虑 hacky 解决方案(例如,围绕 await 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 上的其他问题并未解决此特定问题。建议重复项时请小心。

最佳答案

我不同意你的问题标题中暗示 await 的行为是不受欢迎的。这在绝大多数情况下都是有意义的。在 WhenAll 情况下,您真正多久需要知道所有错误详细信息,而不是只知道一个?

AggregateException 的主要困难在于异常处理,即您失去了捕获特定类型的能力。

也就是说,您可以使用扩展方法获得所需的行为:

public static async Task WithAggregateException(this Task source)
{
try
{
await source.ConfigureAwait(false);
}
catch
{
// source.Exception may be null if the task was canceled.
if (source.Exception == null)
throw;

// EDI preserves the original exception's stack trace, if any.
ExceptionDispatchInfo.Capture(source.Exception).Throw();
}
}

关于c# - 我想等待抛出 AggregateException,而不仅仅是第一个异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com