2013-02-15 59 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()可能就足夠了。

相關問題