响应式框架初探

3
这是介绍响应式框架的简单程序。但我想尝试错误处理程序,通过修改程序为:
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);

我希望能够看到异常信息的输出,但控制台应用程序崩溃了。原因是什么?
3个回答

5

异常处理程序用于处理在被观察者本身中创建的异常,而非由观察者创建的异常。

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

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

我认为你是正确的,然而你提供的例子也不会输出ex信息。该应用将因除以零异常而崩溃。 - Cheng Chen
@Danny:不是我的问题...我运行了这个示例,它打印出了“Bang!”和异常。如果你运行了完整的示例并且异常被传播了,你能指出你使用的Rx和.NET的版本吗? - Jon Skeet
@Jon Skeet:Rx适用于.NET 4,.NET 4在VS2010上。 - Cheng Chen
@Danny:我已经编辑了示例,以显示在末尾添加的额外行,它可以完全正常地显示。您能否详细说明您所说的“应用程序将崩溃”是什么意思?它只是进入调试器吗? - Jon Skeet
1
@Danny:尝试完全不使用调试器。这样应该没问题。我怀疑是由于调试器设置而导致进入调试器中断...但如果你在中断时只是按F5,那就没问题了。 - Jon Skeet

3
在Rx库中,任何传递给在IObservable上工作的操作符(如Select、Where、GroupBy等)的用户代码都会被捕获并发送到订阅该可观察对象的观察者的OnError处理程序中。这些异常被处理的原因是它们是计算的一部分。
在观察者代码中发生的异常将需要由用户处理。因为它们在计算结束时发生,所以Rx不清楚如何处理这些异常。

1
听听这个人说的话,我有预感他知道自己在说什么 ;) - Sergey Aldoukhov

0

它真的崩溃了还是跳转到Visual Studio并显示异常?如果第二种情况属实,您应该查看菜单栏中的“调试 - 异常”,并取消右侧的所有选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接