0

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この方法よりも良い名前を思いつくことができればボーナスポイント。

4

1 に答える 1