2012-12-27 34 views
2

我创建了一个ReactiveAsyncCommand(SL5),并且无法获取订阅以触发OnError方法。下面是代码订阅ReactiveAsyncCommand不会调用抛出异常的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。

回答

3

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

如果这没有任何意义,也不用担心,只是处理ThrownExceptions,并承担订阅只接收OnNext

+0

它是预期的行为,我都必须订阅指令的ThrownExceptions *和*指定RegisterAsyncTask()中的OnError lambda。Subscribe()?如果我省略了OnError lambda(在我的情况下它将是空的),在ThrownExceptions处理程序执行并返回后,异常将在UI线程上引发(在我无法捕获它的上下文中)。如果两者都被指定,则两者都会被执行,并且异常不会在UI线程上抛出。 –

+0

它可能目前是预期的行为,但预期的行为很糟糕。你能提交一个错误吗? –