Реактивная платформа Hello World - PullRequest
3 голосов
/ 13 июля 2010

Это простая программа для представления 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 ]

5 голосов
/ 13 июля 2010

Обработчик исключений используется для исключений, созданных в самой наблюдаемой, а не наблюдателем.

Простой способ вызвать обработчик исключений - что-то вроде этого:

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
3 голосов
/ 13 июля 2010

В библиотеке Rx любой пользовательский код, переданный в оператор, который работает с IObservable (Select, Where, GroupBy и т. Д.), Будет перехвачен и отправлен в обработчик OnError наблюдателей, подписанных на наблюдаемое.Причина, по которой они обрабатываются, заключается в том, что они являются частью вычислений.

Исключения, возникающие в коде Observer, должны обрабатываться пользователем.Поскольку они находятся в конце вычислений, Rx неясно, как с ними обращаться.

0 голосов
/ 13 июля 2010

Действительно ли происходит сбой или происходит переход в Visual Studio, и он показывает, что произошло исключение?Если второе верно, вы должны взглянуть на Debug - Exception в строке меню и отменить выбор всего справа.

...