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

.NET ReactiveExtension observer isn't catching errors in OnError

当使用 ReactiveExtension Observer 时,异常不会被 onError 操作捕获。使用下面的示例代码而不是捕获异常 "An unhandled exception of type 'System.ApplicationException' occurred in System.Reactive.Core.dll" 并且应用程序终止。该异常似乎绕过了调用堆栈中的每个 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);

我是否遗漏了 observables 应该如何处理异常?

如果我在 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 动作捕获异常?

只有在 observable 中引发异常才会被捕获。如果它们在 observer 中出现,那么你必须自己捕捉它们。

这有很多原因:

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