订阅ReactiveAsyncCommand并不会在抛出异常时调用OnError

时间:2012-12-27 02:32:41

标签: reactiveui

我创建了一个ReactiveAsyncCommand(SL5)并且无法获得触发OnError方法的订阅。这是代码

        Start1Command = new ReactiveAsyncCommand();
        Start1Command.RegisterAsyncObservable(_ => this.Start())
            .Subscribe<int>(
                u => Debug.WriteLine("OnNext-->" + u.ToString()),
                ex => Debug.WriteLine("OnError-->" + ex.Message),
                () => Debug.WriteLine("OnComplete-->")
            );
        Start1Command.Execute(null);

开始

的代码
 public IObservable<int> Start()
 {
     return Observable.Start(() =>
         {
            throw new Exception("Exception");
            return 42;
         },
         RxApp.TaskpoolScheduler);
 }

当我运行此代码时,我从ReactiveUI框架中获得一个异常,它建议我应该订阅ThrownExceptions。当我这样做时,上面抛出的异常被正确处理。

 Start1Command.ThrownExceptions.Subscribe(ex => Debug.WriteLine("ThrownExceptions OnNext-->" + ex.Message));

我是否应该预期命令订阅会调用OnError?或者我必须使用ThrownExceptions。

1 个答案:

答案 0 :(得分:3)

通常情况下,您的期望是完全正确的。但是,RegisterAsync*会有效拦截OnError。这样可以更轻松地针对RegisterAsync进行编程,因为一旦您处理OnError一次,在Subscribe中,它就再也无法工作了。处理ThrownExceptions意味着您不需要处理重新订阅。

如果这没有意义,请不要担心,只需处理ThrownExceptions并假设订阅仅接收OnNext