2010-07-13 6 views
3

Ceci est an easy program to introduce the Reactive Framework. Mais je veux essayer le gestionnaire d'erreurs, en modifiant le programme soit:Cadre Réactif Hello World

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(); 

Dans cet exemple la surcharge follwing est utilisé. J'ai espéré voir le message d'exception imprimé, mais l'application de la console s'est plantée. Quelle est la raison?

Répondre

5

Le gestionnaire d'exceptions est utilisé pour les exceptions créées dans l'observable lui-même, et non par l'observateur.

Un moyen facile de provoquer le gestionnaire d'exception est quelque chose comme ceci:

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"); 
    } 
} 

Sortie:

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 
+0

Je pense que vous avez raison, mais l'exemple que vous avez donné n'imprimera pas non plus le message ex. L'application sera écrasée avec Divided By Zero Exception. –

+0

@Danny: Pas sur ma boîte ... J'ai couru cet exemple et il a imprimé "Bang!" et l'exception. Si vous avez exécuté l'exemple complet et que l'exception a été propagée, pourriez-vous indiquer quelle version de Rx et .NET vous utilisez? –

+0

@Jon Skeet: Rx pour .NET 4, .NET 4 sur VS2010 –

0

-t-il réellement écrasé ou sauts Visual Studio dans et vous montre qu'une exception a eu lieu? Si le second est vrai, jetez un coup d'oeil dans Debug - Exception dans la barre de menu et désélectionnez tout sur la droite.

3

Dans la bibliothèque Rx, tout code utilisateur passé dans un opérateur qui fonctionne sur IObservable (Select, Where, GroupBy etc ...) sera intercepté et envoyé au gestionnaire OnError des observateurs abonnés à l'observable. La raison pour laquelle ils sont traités est qu'ils font partie du calcul.

Les exceptions se produisant dans le code Observer devront être traitées par l'utilisateur. Comme ils sont à la fin du calcul, Rx ne sait pas comment les gérer.

+1

Écoutez l'homme, j'ai l'intuition qu'il sait de quoi il parle;) –