C# .NET ReactiveExtension观察器isn';t捕获OneError中的错误

C# .NET ReactiveExtension观察器isn';t捕获OneError中的错误,c#,exception,system.reactive,C#,Exception,System.reactive,使用ReactiveExtension时,onError操作不会捕获异常。使用下面的示例代码,而不是捕获异常“System.Responsive.Core.dll中发生类型为'System.ApplicationException'的未处理异常”,应用程序终止。异常似乎绕过了调用堆栈中的每个try/catch var source = Observable.Interval(TimeSpan.FromSeconds(seconds)); var observer = Observer.Creat

使用ReactiveExtension时,onError操作不会捕获异常。使用下面的示例代码,而不是捕获异常“System.Responsive.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);
var source=Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer=observer.Create(
l=>
{ 
//做点什么
抛出新的ApplicationException(“测试异常”);
},
ex=>Console.WriteLine(ex));
var subscription=来源。订阅(观察者);
我是否遗漏了异常应该如何由可观察对象处理

如果我在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);
var source=Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer=observer.Create(
l=>
{ 
尝试
{
//做点什么
抛出新的ApplicationException(“测试异常”);
}
捕获(例外情况除外)
{
//异常可以在此处捕获并记录
控制台写入线(ex);
}
},
ex=>Console.WriteLine(ex));
var subscription=来源。订阅(观察者);

要让OneError操作捕获异常,我需要做什么?

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

这是有道理的,原因有很多:

  • 如果有多个观察器连接到一个热观察器,那么您不希望流被终止,因为其中一个观察器做错了什么
  • 你不想让其他观察者知道其他观察者的工作原理
  • 如果一个观察者在另一个观察者成功处理了一个值之后,但在下一个观察者观察到异常之前,在一个观察者中抛出异常,则可能会以不一致的状态结束

  • 最重要的是,也许,不管被观察者的温度如何,都无法处理观察者抛出的异常;e、 例如,您将无法区分错误是来自可观察者还是观察者。指定一个
    onError
    处理程序只会抑制有价值的诊断信息,而不会确保计算或应用程序通常处于一致状态。@DaveSexton-非常正确。