问题描述
public async IAsyncEnumerable<Entity> GetEntities(IQueryOptions options){
if(!validator.ValidateQuery(options)) { throw new ArgumentException(nameof(options));}
var data = dataSource.ReadEntitiesAsync(options);
await foreach (var entity in data) { yield return await converter.ConvertAsync(entity);}
}
是否可以将ArgumentException
准确地抛出到GetEntities()
方法调用中,而不是像下面这样的迭代第一步之后:
await foreach(var e in GetEntities(options)) { // some code here }
我之所以问是因为,当我想将IAsyncEnumerable
返回到我的API控制器时,该异常实际上是在框架代码中引发的。我没有机会抓住它,并返回HTTP 404错误请求代码。当然,我可以在请求管道中拦截异常,但是有时我想根据它们来自的抽象层将它们包装在其他异常中。
解决方法
将其拆分为两个功能。 Here是一个示例:
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
public class Program
{
public static async Task Main()
{
var enumeration = AsyncEnumeration(-1);
await foreach(int x in enumeration)
{
Console.WriteLine(x);
}
}
public static IAsyncEnumerable<int> AsyncEnumeration(int count)
{
if (count < 1)
throw new ArgumentOutOfRangeException();
return AsyncEnumerationCore(count);
}
private static async IAsyncEnumerable<int> AsyncEnumerationCore(int count)
{
for (int i = 0; i < count; i++)
{
yield return i;
await Task.Delay(1);
}
}
}