订阅ReactiveUi中的ThrownExceptions

时间:2014-09-26 19:42:21

标签: c# reactiveui

我正在迁移到Reactive UI的第6版,并且我正在尝试更全面地使用它提供的工具,即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");
    }

我的假设是我会看到一个&#34; Exception Handled&#34;抛出异常时的MessageBox。我确定我订阅了某些东西,但现在还不清楚它是什么。

1 个答案:

答案 0 :(得分:4)

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中,您永远不应将Interesting™代码放在Subscribe块中 - 订阅仅用于记录操作结果,或将属性连接到其他属性。