2

I have a basic ReactiveCommand. No async wizardry, just plain old ReactiveCommand.Create(). I Subscribe() with the overload that takes an exception handler, but never hit the breakpoint in said exception handler (I did not expect this). I subscribe to ThrownErrors, never hit the breakpoint in that exception handler either (I sort of expected this).

Here's the example code:

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();
          });

I did my homework and checked the questions and answers in the topic.

ReactiveUI exception handling

How to catch exception from ReactiveCommand?

I have checked the mail list as well, and found this: https://groups.google.com/forum/#!topic/reactivexaml/Dkc-cSesKPY

So I decided to change this to some async solution:

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");
}

And yet, I never hit any of my breakpoints, except the one in the Throw() method. :(

What am I doing wrong? How am I supposed to catch exceptions here?

Edit:

I do, however, hit the exception handler breakpoint when I throw the exception from within the observable, like this

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

Question modified to: "am I capable of handling an exception from within the method and not the observable?"

Community
  • 1
  • 1
Attila Bertok
  • 58
  • 1
  • 8

1 Answers1

1

This is a bug in the current release of ReactiveUI - the exception thrown while creating the 'execute' observable is swallowed and the internal state of the ReactiveCommand is left in a broken state. This has been fixed in the next release.

See this github issue for details.

Charles Mager
  • 25,735
  • 2
  • 35
  • 45