作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在等待错误任务(设置了异常的任务)时,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/
我是一名优秀的程序员,十分优秀!