2014-09-26 32 views
1

我正在迁移到Reactive UI的第6版,并试图更完全地使用它提供的工具,即ThrownExceptions。当我订阅抛出的异常属性时什么都不会发生。我确信我错过了一些东西,只是不确定它现在是什么。在ReactiveUi中订阅ThrownExceptions

在我简化的例子中,有一个命令绑定它的按钮。

public ReactiveCommand<object> Delete { get; private set; } 

    public MainWindowViewModel() 
    { 
     Delete = ReactiveCommand.Create(); 
     Delete.Subscribe(e => CommandExec()); 
     Delete.ThrownExceptions.Subscribe(ex => HandleException(ex)); 

    } 

    private object HandleException(Exception ex) 
    { 
     MessageBox.Show("Exception Handled"); 
     return null; 
    } 

    public IObservable<object> CommandExec() 
    { 
     throw new Exception("throwing"); 
    } 

我的假设是,当抛出异常时我会看到一个“Exception Handled”MessageBox。我确定我正在订阅某些内容,但目前尚不清楚它是什么。

回答

3

ThrownExceptions仅适用于使用CreateAsyncXYZ声明的后台操作:

var someCmd = ReactiveCommand.CreateAsyncObservable(_ => 
    Observable.Throw<Unit>(new Exception("Oh Noes!")); 

someCmd.ThrownExceptions.Subscribe(ex => Console.WriteLine(ex.Message)); 

await someCmd.ExecuteAsync(); 
>>> Oh Noes! 

在ReactiveUI,你永远不应该把有趣™代码订阅块中 - 订阅仅登录操作,或者线的结果为其他物业提供物业。

+0

首先,祝贺“有趣”的商标。其次,我试图按照https://github.com/reactiveui/rxui-design-guidelines上的指导方针。不是viewmodel delete命令订阅点击和做“某事”,同时也订阅“某些东西”可能抛出的异常?这些东西是否仍然需要处理自己的错误? – priehl 2014-09-29 16:40:25

+0

我已经提出了对[拉取请求](https://github.com/reactiveui/rxui-design-guidelines/pull/14)中的准则的更改,这将有助于澄清这些问题。 – 2015-02-02 20:25:05