微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在实际迭代发生之前,如何验证IAsyncEnumerable返回方法的参数?

如何解决在实际迭代发生之前,如何验证IAsyncEnumerable返回方法的参数?

我有一个简单的场景,其中有一个使用以下方法的类:

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);
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?