IObservable ( Reactive Extensions ) には次の拡張メソッドがあります。Action
(戻り値なし)を実行したいのですが、Maybe<T>
モナドを使用して実行アクションの例外状態を渡します。アクションが完了した場合は、None.Default を通過させたいと思います。それ以外の場合は、発生した例外を含む Some を渡します。
私の実装は以下です
public static IObservable<Maybe<Exception>> Catch<T>
( this IObservable<T> source
, Action<T> action
)
{
var happy = source.Select(p => {
action(p);
return None<Exception>.Default;
});
return happy.Catch<Maybe<Exception>,Exception>
(e => Observable
.Return(e.ToMaybe()).Concat(happy));
}
そして私はテストケースを持っています
[Fact]
public void TryShouldHandleExceptions()
{
// Make a hot observable
var b = new List<int>() { 0, 1, 2 }.ToObservable().Publish().RefCount();
// Execute actions and collect exception state
IObservable<Maybe<Exception>> e = b.Catch(v => {
if (v==1)
{
throw new Exception("Ouch");
}
});
var r = e.ToEnumerable().ToList();
r.Count().Should().Be(3);
r[0].IsSome.Should().Be(false);
r[1].IsSome.Should().Be(true);
r[2].IsSome.Should().Be(false);
}
ただし、テスト ケースは失敗し、RX Catch メソッドによって処理される代わりに例外が発生します。ここで私が間違ったことを確認してください。何か案は?
ところで。Catch
この方法よりも良い名前を思いつくことができればボーナスポイント。