.NET ReactiveExtension观察者未捕获OnError中的错误

时间:2015-02-18 22:56:44

标签: c# exception system.reactive

使用ReactiveExtension观察者时,onError操作不会捕获异常。使用下面的示例代码而不是捕获的异常“在System.Reactive.Core.dll中发生未处理的类型'System.ApplicationException'异常”并且应用程序终止。异常似乎绕过了调用堆栈中的每个try / catch。

var source = Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer = Observer.Create<long>(
    l =>
    { 
       //do something
       throw new ApplicationException("test exception");
    },
    ex => Console.WriteLine(ex));
var subscription = source.Subscribe(observer);

我是否错过了可观察对象应如何处理异常?

如果我在onNext操作中设置了try catch,则会捕获异常并且我可以记录它。

var source = Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer = Observer.Create<long>(
    l =>
    { 
       try
       {
         //do something
         throw new ApplicationException("test exception");
       }
       catch(Exception ex)
       {
          //exception can be caught here and logged
          Console.WriteLine(ex);
       }
    },
    ex => Console.WriteLine(ex));
var subscription = source.Subscribe(observer);

如何通过onError操作捕获异常,我需要做什么?

1 个答案:

答案 0 :(得分:5)

只有在可观察中引发异常时才会触发异常。如果他们是在观察者中长大的,那么你必须亲自抓住它们。

这有多种原因:

  1. 如果您有几个观察者附加到一个热观察者,那么您不希望该流被终止,因为其中一个观察者做错了。
  2. 您不希望其他观察者了解其他观察员的工作情况
  3. 如果在一个观察者之后抛出异常,而另一个观察者成功处理了一个值,但在下一个观察到它之前,你可能最终处于一个不一致的状态。