如何从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