我有以下 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
这种方法更好的名字,那就加分了。