我有一个简单的代码,意图返回一个枚举器,如果文件不存在或其中的数据版本过时,则返回数据库。很简单。但是我不确定这个方法如何运作。原因如下:
public override IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
try
{
return GetFromFiles(); // returns instantly here
}
catch (ArgumentOutOfRangeException)
{
return GetFromBackingStore();
}
catch (FileNotFoundException)
{
return GetFromBackingStore();
}
}
而 GetFromFiles
看起来像这样:
private IEnumerator<KeyValuePair<TKey, TValue>> GetFromFiles()
{
foreach (var path in _paths)
{
using (var fs = _versioner.TryOpen(path))
{
var reader = _serializerFactory.CreateSerializer(fs, FileAccess.Read);
KeyValuePair<TKey, TValue> pair;
while (reader.Read(out pair))
{
yield return pair;
}
}
}
}
现在问题是,当使用foreach调用GetEnumerator时,它会立即返回而不执行GetFromFiles的调用,但随后它会回到GetFromFiles方法,但现在try-catch已经不起作用了,所以如果TryOpen抛出异常,则无法处理异常。我正在尝试理解原因以及如何解决它。我认为这一定与yield return有关,如果是这种情况,是否有方法可以解决问题?