2013-02-15 57 views
1

一些功能等同于这个是否有RX扩展来创建可观察到的从另一个观察到的,只有捕获异常

//someObservable is an observable from another part of my application which produces Command objects 
//can also have a ConnectionException 

IObservable<Command> someObservable; 

Subject<Command> sub = new Subject<Command>(); 

someObservable.Subscribe(c => { }, x => 
{ 
     sub.OnError(x); 
}); 

这将让我有一个观察的只是例外,这样我可以在其他地方处理它们

回答

0

您可以让一个用户只处理错误(并且对序列中的常规项目不做任何处理),并使用Catch()来消除其他地方的错误。

0

不要忘记,一旦可观察到的错误,它就完成了。您当然可以订阅,或者使用Observable.Catch或Finally扩展方法之一,但只会出现一个错误。

1

您可以使用Materialize/Dema materialize来过滤除了例外之外的所有内容。例如:

var subject = new Subject<int>(); 

var onlyExceptions = subject.Materialize().Where(n => n.Exception != null).Dematerialize(); 

subject.Subscribe(i => Console.WriteLine("Subscriber 1: {0}", i), 
        ex => Console.WriteLine("Subscriber 1 exception: {0}", ex.Message)); 

onlyExceptions.Subscribe(i => Console.WriteLine("Subscriber 2: {0}", i), 
          ex => Console.WriteLine("Subscriber 2 exception: {0}", ex.Message)); 

subject.OnNext(123); 
subject.OnError(new Exception("Test Exception")); 
1

此扩展方法将永远只返回一个OnError,并且当且仅当源发送OnError。

public static IObservable<T> ErrorsOnly<T>(this IObservable<T> source) 
{ 
    return source.IgnoreElements().Concat(Observable.Never<T>()); 
} 

不知道它在实践中有多大用处。如果你不关心OnCompleted(),IgnoreElements()可能就足够了。

相关问题