C# 反应式框架Hello World

C# 反应式框架Hello World,c#,.net,system.reactive,reactive-programming,C#,.net,System.reactive,Reactive Programming,这是。但我想尝试错误处理程序,将程序修改为: var cookiePieces = Observable.Range(1, 10); cookiePieces.Subscribe(x => { Console.WriteLine("{0}! {0} pieces of cookie!", x); throw new Exception(); // newly added by myself }, ex => Console.Write

这是。但我想尝试错误处理程序,将程序修改为:

var cookiePieces = Observable.Range(1, 10);
cookiePieces.Subscribe(x =>
   {
      Console.WriteLine("{0}! {0} pieces of cookie!", x);
      throw new Exception();  // newly added by myself
   },
      ex => Console.WriteLine("the exception message..."),
      () => Console.WriteLine("Ah! Ah! Ah! Ah!"));
Console.ReadLine();
在此示例中,使用了以下重载

public static IDisposable Subscribe<TSource>(
     this IObservable<TSource> source, 
     Action<TSource> onNext, 
     Action<Exception> onError, 
     Action onCompleted);
公共静态IDisposable订阅(
这是一个可观测的来源,
下一步行动,
行动一个错误,
行动未完成);

我希望看到打印的异常消息,但是控制台应用程序崩溃了。原因是什么?

异常处理程序用于在可观察对象本身中创建的异常,而不是由观察者创建的异常

引发异常处理程序的简单方法如下:

using System;
using System.Linq;

class Test
{
    static void Main(string[] args)
    {
        var xs = Observable.Range(1, 10)
                           .Select(x => 10 / (5 - x));

        xs.Subscribe(x => Console.WriteLine("Received {0}", x),
                     ex => Console.WriteLine("Bang! {0}", ex),
                     () => Console.WriteLine("Done"));

        Console.WriteLine("App ending normally");
    }
}
输出:

Received 2
Received 3
Received 5
Received 10
Bang! System.DivideByZeroException: Attempted to divide by zero.
   at Test.<Main>b__0(Int32 x)
   at System.Linq.Observable.<>c__DisplayClass35a`2.<>c__DisplayClass35c.<Select
>b__359(TSource x)
App ending normally
收到2个
收到3份
收到5份
收到10份
猛敲System.DivideByZeroException:尝试除以零。
在测试点b_uu0(Int32 x)
在System.Linq.Observable.c__DisplayClass35a`2.c__DisplayClass35c.b__359(t源x)
应用程序正常结束

它是否真的会崩溃或跳转到Visual Studio并向您显示发生了异常?如果第二个是真的,您应该查看菜单栏中的Debug-Exception并取消选择右侧的所有内容。

在Rx库中,传递给在IObservable上工作的操作员的任何用户代码(Select、Where、GroupBy等)都将被捕获,并发送给订阅了observable的操作员的OnError处理程序。这些被处理的原因是它们是计算的一部分


观察者代码中出现的异常必须由用户处理。由于它们在计算结束时,不清楚如何处理它们。

我认为您是对的,但是您给出的示例也不会打印ex消息。应用程序将崩溃,出现除零异常。@Danny:不在我的盒子上。。。我运行了这个示例,它输出了“砰!”和异常。如果您运行了完整的示例,并且传播了异常,您能否指出您使用的是哪个版本的Rx和.NET?@Jon Skeet:Rx for.NET 4,.NET 4 onVS2010@Danny:我对示例进行了编辑,在末尾显示了一条额外的线,这条线正常显示。你能详细说明你所说的“应用程序会崩溃”是什么意思吗?它只是闯入了调试器吗?@Danny:不用调试器就试试吧。会好的。我怀疑由于调试器设置,它正在侵入调试器。。。但是如果你在F5的时候碰到它,应该没问题。听这个人说,我有一种预感,他知道他在说什么;)