0

フローがキャッチブロックに到達しない理由について混乱しています。例外が発生するとメソッドが呼び出されることは理解していますが、が呼び出されOnErrorたときに例外が発生するべきではありませんToObservableか?3番目の数値(0)を処理する場合にのみ、例外が発生します。私は完全に混乱しています。

        static void Main()
        {
            try
            {
                var numbers = from number in
                                  new int[] { 1, 2, 0, 3 }
                              select 10 / number;
                var observable = numbers.ToObservable();
                observable.Subscribe(OnNext, OnError, OnComplete);
                Console.ReadKey();
            }
            catch (Exception exc)
            {
                Console.WriteLine("Program terminated with the following message - {0}", exc.Message);
            }
        }

        private static void OnNext(int i)
        {
            Console.WriteLine("Output : " + i);
        }

        private static void OnError(Exception exc)
        {
            Console.WriteLine("In oops : {0}", exc.Message);
        }

        private static void OnComplete()
        {
            Console.WriteLine("In done");
        }
4

2 に答える 2

3

Linq は遅延評価されます。これは、 を呼び出すまで何も評価されないことを意味しますSubscribe()。これが、catch ブロックがヒットしない理由です。

于 2012-02-11T12:39:44.900 に答える
1

Selector をスローすることは、OnError を実行することと同じではありません。Start などの特定の演算子は、コードを try/catch でラップし、OnError にマーシャリングしますが、ほとんどはそうしません。すべての LINQ Select が try/catch でラップされていると想像してみてください! それはかなり遅いでしょう。OnNext サブスクライブについても同様です。

この動作を備えたSelect のバージョンを作成したい場合は、次の方法があります。

public static IObservable<TRet> SafeSelect(this IObservable<T> This, Func<T,TRet> selector)
{
    return This.SelectMany(x => {
        try {
            return Observable.Return(selector(x));
        } catch (Exception ex) {
            return Observable.Throw<TRet>(ex);
        }
    });
}
于 2012-02-11T19:34:02.107 に答える