ファイルが存在しない場合、またはファイル内のデータのバージョンが古くなっている場合に、ファイルまたはデータベースに対して列挙子を返すことを意図した単純なコードがあります。単純。しかし、私はその方法がどのように機能するかについて苦労しています。理由は次のとおりです。
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
。これが事実である場合、トリックを行う方法はありますか?