如何捕获ReactiveCommand Exceptions?

时间:2016-03-23 15:55:41

标签: c# exception-handling reactiveui

我有一个基本的ReactiveCommand。没有异步巫术,只有普通的ReactiveCommand.Create()。我Subscribe()带有异常处理程序的重载,但从未在所述异常处理程序中遇到断点(我没想到这一点)。我订阅了ThrownErrors,从未在异常处理程序中点击断点(我有点期待)。

以下是示例代码:

var myCommand = ReactiveCommand.Create();

// this does not seem to work
myCommand.Subscribe(
    _ => { throw new Exception("oops"); },
    ex => { 
            Console.WriteLine(ex.Mesage);
            Debugger.Break(); 
          });

//this does not seem to work either
myCommand.ThrownExceptions.Subscribe(
    ex => { 
            Console.WriteLine(ex.Mesage);
            Debugger.Break();
          });

我完成了我的作业并检查了主题中的问题和答案。

ReactiveUI exception handling

How to catch exception from ReactiveCommand?

我也检查了邮件列表,发现了这个: https://groups.google.com/forum/#!topic/reactivexaml/Dkc-cSesKPY

所以我决定将其改为某种异步解决方案:

var myCommand = ReactiveCommand.CreateAsyncObservable(_ => this.Throw());
myCommand.Subscribe(
    _ => { Console.WriteLine("How did we get here?"); },
    // this is not expected to work
    ex => { 
            Console.WriteLine(ex.Message);
            Debugger.Break();
          });

// however, I sort of expect this to work
myCommand.ThrownExceptions.Subscribe(
    ex => {
            Console.WriteLine(ex.Message);
            Debugger.Break();
          });

[...]

private IObservable<object> Throw()
{
    Debugger.Break();
    throw new Exception("oops");
}

但是,除了Throw()方法中的那个断点之外,我从未打过任何断点。 :(

我做错了什么?我怎么能在这里捕捉异常?

修改

但是,当我从observable中抛出异常时,我确实遇到了异常处理程序断点,就像这样

private IObservable<object> Throw()
{
    Debugger.Break();
    return Task.Factory.StartNew(() =>
            {
                throw new Exception("oops");
                return new object();
            }).ToObservable();
}

问题修改为:&#34;我是否能够从方法中处理异常而不是可观察的异常?&#34;

1 个答案:

答案 0 :(得分:1)

这是当前版本的ReactiveUI中的一个错误 - 吞下创建'execute'observable时抛出的异常,并且ReactiveCommand的内部状态处于损坏状态。这已在下一版本中修复。

有关详细信息,请参阅this github issue