2012-12-27 32 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

它可能目前是預期的行爲,但預期的行爲很糟糕。你能提交一個錯誤嗎? –