如何从ReactiveCommand中捕获异常?

问题描述:

我知道如何处理由ReactiveCommand<T>调用的异步任务抛出的异常,但是如何处理返回任务之前抛出的异常呢?如何从ReactiveCommand中捕获异常?

在以下示例中,ThrowAndHandle命令将在异步任务执行时抛出异常并处理异常。命令ThrowButFailToHandle表明我不能使用ThrownExceptions来处理任务中未发生的异常,而是在创建任务之前处理异常。如何处理这样的例外?

public class ViewModel 
{ 
    public IReactiveCommand ThrowAndHandle { get; private set; } 
    public IReactiveCommand ThrowButFailToHandle { get; private set; } 

    public ViewModel() 
    { 
     ThrowAndHandle = ReactiveCommand.CreateAsyncTask(_ => ThrowFromTask()); 
     ThrowAndHandle.ThrownExceptions.Subscribe(HandleException); 

     ThrowButFailToHandle = ReactiveCommand.CreateAsyncTask(_ => ThrowBeforeTaskIsReturned()); 
     ThrowButFailToHandle.ThrownExceptions.Subscribe(ThisMethodWillNotBeCalled); 
    } 

    private Task ThrowFromTask() 
    { 
     return Task.Run(() => 
     { 
      throw new Exception("This exception will appear in IReactiveCommand.ThrownExceptions"); 
     }); 
    } 

    private Task ThrowBeforeTaskIsReturned() 
    { 
     throw new Exception("How can I handle this exception?"); 
    } 

    private void HandleException(Exception ex) 
    { 
     // This method is called when ThrownFromTask() is called 
    } 

    private void ThisMethodWillNotBeCalled(Exception ex) 
    { 
    } 
} 

假设你的命令直接绑定到UI,简短的答案是你不能。

的异常将被传播到ExecuteAsync的onError的处理程序观察到的,这是忽略了为每Execute实现:

public void Execute(object parameter) 
    { 
     ExecuteAsync(parameter).Catch(Observable.Empty<T>()).Subscribe(); 
    } 

现在,如果你深深地需要捕捉这个异常,可以肯定:

  • 包裹ReactiveCommand成一个ICommand,具有在错误
  • 不同Execute行为包裹拉姆达传递给CreateAsyncCommand在异常时返回失败任务结果
  • issue/PR on_realui将这些异常传播到ThrownExceptions