如果文件不存在或其中的数据版本已过时,我有简单的代码旨在通过文件或数据库返回枚举器。简单的。但是,我正在努力解决该方法的工作原理。原因如下:
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;
}
}
}
}
现在的问题是,当GetEnumerator
使用 foreach 调用时,它会立即返回而无需GetFromFiles
先执行调用,但随后会返回到GetFromFiles
方法,但现在try-catch
已经不在播放中,因此如果TryOpen
抛出异常,则不会处理异常。我试图了解为什么以及如何解决它。它必须与yield return
我认为有关,如果是这种情况,有没有办法做到这一点?