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