代码之家  ›  专栏  ›  技术社区  ›  Cheng Chen

反应框架Hello World

  •  3
  • Cheng Chen  · 技术社区  · 14 年前

    这是 an easy program to introduce the Reactive Framework . 但我想尝试错误处理程序,将程序修改为:

    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 回复  |  直到 13 年前
        1
  •  5
  •   Jon Skeet    14 年前

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

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

    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
  •   Jeffrey van Gogh    14 年前

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

    观察者代码中发生的异常必须由用户处理。由于他们在计算的最后,还不清楚如何处理这些。

        3
  •  0
  •   Oliver    14 年前

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