0

我有以下 IObservable ( Reactive Extensions ) 的扩展方法。我想运行一个(无返回值),但使用我的monadAction传递运行操作的异常状态。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

2

我只是太复杂了。这工作正常

    public static IObservable<Maybe<Exception>> Catch<T>
        ( this IObservable<T> source
        , Action<T> action
        )
    {
        return source.Select(p => {
            try
            {
                action(p);
                return None<Exception>.Default; 
            }
            catch (Exception e)
            {
                return e.ToMaybe();
            }
        });

    }
于 2013-06-27T10:27:57.560 回答