订阅ReactiveUi中的ThrownException

本文关键字:ThrownException 中的 ReactiveUi 订阅 | 更新日期: 2023-09-27 18:24:45

我正在迁移到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");
    }

我的假设是,当抛出异常时,我会看到一个"Exception Handled"MessageBox。我确信我订阅了一些东西,只是现在还不清楚它是什么。

订阅ReactiveUi中的ThrownException

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中,您永远不应该将"有趣"™Subscribe块内的代码-Subscribe仅用于记录操作的结果,或将属性连接到其他属性。