0

只是对为什么流程没有到达 catch 块感到困惑。我确实明白,每当发生异常时OnError都会调用方法,但是在调用时不应该发生异常ToObservable吗?只有在处理第三个数字(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'ing 不同。某些运算符(如 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 回答