如何解决尝试赶上IEnumerable无法正常工作
以下代码段旨在在枚举时捕获所有异常,并忽略该特定项。
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
DataProvider[] dataproviders = new DataProvider[]
{
new DataProvider(itemCount: 3,throwAfter: 1),new DataProvider(itemCount: 4),};
var output = ListEnumerable(dataproviders).ToList();
// We'll never get there. I excepted items from second dataprovider here
Console.WriteLine("Success");
}
private static IEnumerable<Item> ListEnumerable(IEnumerable<DataProvider> providers)
{
ArgumentException providerException = null;
foreach (DataProvider provider in providers)
{
providerException = null;
try
{
return provider.GetData();
}
catch (ArgumentException ex)
{
// Expected to catch the argumentexception thrown in GetData here. This never happens
providerException = ex;
Console.WriteLine("Exception caught");
}
}
if (providerException != null)
{
throw providerException;
}
return Enumerable.Empty<Item>();
}
private class DataProvider
{
public DataProvider(int itemCount = 3,int throwAfter = -1)
{
this.ItemCount = itemCount;
this.ThrowAfter = throwAfter;
}
public int ItemCount { get; }
public int ThrowAfter { get; }
public IEnumerable<Item> GetData()
{
for (int i = 0; i < this.ItemCount; ++i)
{
if (i == this.ThrowAfter)
{
throw new ArgumentException("Thrown after " + i);
}
yield return new Item();
}
}
}
private class Item
{
public string Name = Guid.NewGuid().ToString();
}
}
我希望在ListEnumerable
中引发异常,然后转到下一项。但是,运行摘要会导致在main中引发异常。
为什么会这样?用懒惰的评估仍然完整的数据来表达这一点的正确方法是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。