2016-03-23 109 views
0

我有一個基本的ReactiveCommand。沒有異步巫術,只是普通的舊版本ReactiveCommand.Create()。 I Subscribe()與承擔異常處理程序的重載,但從來沒有擊中所述異常處理程序中的斷點(我沒有想到這一點)。我訂閱ThrownErrors,從來沒有擊中該異常處理程序的斷點(我有點期待這一點)。如何捕獲ReactiveCommand異常?

這裏的示例代碼:

var myCommand = ReactiveCommand.Create(); 

// this does not seem to work 
myCommand.Subscribe(
    _ => { throw new Exception("oops"); }, 
    ex => { 
      Console.WriteLine(ex.Mesage); 
      Debugger.Break(); 
      }); 

//this does not seem to work either 
myCommand.ThrownExceptions.Subscribe(
    ex => { 
      Console.WriteLine(ex.Mesage); 
      Debugger.Break(); 
      }); 

我做功課,並檢查該主題中的問題和答案。

ReactiveUI exception handling

How to catch exception from ReactiveCommand?

我已經檢查了郵件列表的歡迎,並發現這一點: https://groups.google.com/forum/#!topic/reactivexaml/Dkc-cSesKPY

所以我決定改變這一些異步解決方案:

var myCommand = ReactiveCommand.CreateAsyncObservable(_ => this.Throw()); 
myCommand.Subscribe(
    _ => { Console.WriteLine("How did we get here?"); }, 
    // this is not expected to work 
    ex => { 
      Console.WriteLine(ex.Message); 
      Debugger.Break(); 
      }); 

// however, I sort of expect this to work 
myCommand.ThrownExceptions.Subscribe(
    ex => { 
      Console.WriteLine(ex.Message); 
      Debugger.Break(); 
      }); 

[...] 

private IObservable<object> Throw() 
{ 
    Debugger.Break(); 
    throw new Exception("oops"); 
} 

然而,我從來沒有打過任何我的斷點,除了在Throw()方法。 ?:(

我在做什麼錯了我怎麼在這裏捕獲異常

編輯

我這樣做,但是,命中異常處理程序斷點,當我拋出異常的內可觀察到,像這樣

private IObservable<object> Throw() 
{ 
    Debugger.Break(); 
    return Task.Factory.StartNew(() => 
      { 
       throw new Exception("oops"); 
       return new object(); 
      }).ToObservable(); 
} 

問題修改爲:「我是能夠從方法內處理異常,而不是觀察到的?」

回答

1

這是ReactiveUI當前版本中的一個錯誤 - 吞下創建'execute'observable時拋出的異常,並且ReactiveCommand的內部狀態保持斷開狀態。這已在下一個版本中得到解決。

查看this github issue瞭解詳情。

+0

整潔,謝謝你的信息。 –