【发布时间】:2020-12-09 02:20:11
【问题描述】:
我有一个简单的场景,我有一个具有以下方法的类:
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);}
}
是否可以在 GetEntities() 方法调用时准确地抛出 ArgumentException,而不是像这里这样在迭代的第一步之后:
await foreach(var e in GetEntities(options)) { // some code here }
我问是因为当我想将 IAsyncEnumerable 返回到我的 API 控制器时,框架代码中实际上会引发异常。我没有机会抓住它,并返回一个 HTTP 404 BAD REQUEST 代码。当然我可以拦截请求管道中的异常,但有时我想根据它们来自的抽象层将它们包装在其他异常中。
【问题讨论】:
-
为什么在致电
GetEntities之前不进行验证?枚举器不是用来抛出异常的 -
您可以编写一个非
async的包装方法,并在返回async方法的结果之前同步执行验证。不过,这是否有意义地改变了异常发生的时刻取决于await foreach是如何开展业务的(我不知道)。 -
@JeroenMostert 是的,这实际上是我目前使用的解决方法。无论如何,有时它会导致某些接口方法无法有效地屏蔽无效参数或空值。
-
相关:Method having yield return is not throwing exception。
IEnumerable和IAsyncEnumerable迭代器在这方面是相似的。
标签: c# iasyncenumerable