通常在响应式扩展中,任何未处理的异常都会冒泡并通常导致程序终止,并且ReactiveUI会通过抛出异常(除非已预订ThrownExceptions)来抛出异常。因此,令我惊讶的是,以下代码示例(在RoslynPad中有效)并未真正终止:
#r "nuget:ReactiveUI/9.13.1"
using System.Reactive.Linq;
using ReactiveUI;
class ReactiveExample : ReactiveObject
{
public ReactiveExample()
{
var o = this.ObservableForProperty(x => x.S, skipInitial: true).Select(x => x.Value);
o.Subscribe(s =>
{
Console.WriteLine("received value " + s);
throw new Exception("throw on value " + s);
});
//this.ThrownExceptions.Subscribe(e => throw new Exception("uncaught", e));
}
public string S
{
get => _s;
set => this.RaiseAndSetIfChanged(ref _s, value);
}
private string _s = "";
}
var r = new ReactiveExample();
r.S = "bar";
如果您通过在上面相应的行中进行注释来订阅ThrownExceptions,那么很明显确实引发了异常。
这是错误还是功能?我认为,这是由ReactiveUI.IReactiveObjectExtensions.NotifyObservable中的try / catch引起的,如果ThrownExceptions可观察到的没有订阅者,而不是仅记录该订阅者,我本想会抛出该异常(请参阅https://github.com/reactiveui/ReactiveUI/blob/a4ee168dade8b5e3f34337fabd56eca10eca5200/src/ReactiveUI/ReactiveObject/IReactiveObjectExtensions.cs从382行开始。
答案 0 :(得分:0)
https://reactiveui.net/docs/handbook/default-exception-handler/
我建议您提交一个错误,因为该异常会加剧
值得一提的是ObservableForProperty是供内部使用的。