.NET ReactiveExtension 观察器未捕获 OnError 中的错误
.NET ReactiveExtension observer isn't catching errors in OnError
当使用 ReactiveExtension Observer 时,异常不会被 onError 操作捕获。使用下面的示例代码而不是捕获异常 "An unhandled exception of type 'System.ApplicationException' occurred in System.Reactive.Core.dll" 并且应用程序终止。该异常似乎绕过了调用堆栈中的每个 try/catch。
var source = Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer = Observer.Create<long>(
l =>
{
//do something
throw new ApplicationException("test exception");
},
ex => Console.WriteLine(ex));
var subscription = source.Subscribe(observer);
我是否遗漏了 observables 应该如何处理异常?
如果我在 onNext 操作中放置一个 try catch,那么异常就会被捕获并且我可以记录它。
var source = Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer = Observer.Create<long>(
l =>
{
try
{
//do something
throw new ApplicationException("test exception");
}
catch(Exception ex)
{
//exception can be caught here and logged
Console.WriteLine(ex);
}
},
ex => Console.WriteLine(ex));
var subscription = source.Subscribe(observer);
我需要做什么才能让 onError 动作捕获异常?
只有在 observable 中引发异常才会被捕获。如果它们在 observer 中出现,那么你必须自己捕捉它们。
这有很多原因:
- 如果你有几个观察者连接到一个热观察者,那么你不希望流被终止,因为其中一个观察者做错了。
- 您不希望其他观察者知道其他观察者的工作
- 如果一个观察者在另一个观察者成功处理一个值后抛出异常,但在下一个观察者观察它之前,您可能会处于不一致状态。
当使用 ReactiveExtension Observer 时,异常不会被 onError 操作捕获。使用下面的示例代码而不是捕获异常 "An unhandled exception of type 'System.ApplicationException' occurred in System.Reactive.Core.dll" 并且应用程序终止。该异常似乎绕过了调用堆栈中的每个 try/catch。
var source = Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer = Observer.Create<long>(
l =>
{
//do something
throw new ApplicationException("test exception");
},
ex => Console.WriteLine(ex));
var subscription = source.Subscribe(observer);
我是否遗漏了 observables 应该如何处理异常?
如果我在 onNext 操作中放置一个 try catch,那么异常就会被捕获并且我可以记录它。
var source = Observable.Interval(TimeSpan.FromSeconds(seconds));
var observer = Observer.Create<long>(
l =>
{
try
{
//do something
throw new ApplicationException("test exception");
}
catch(Exception ex)
{
//exception can be caught here and logged
Console.WriteLine(ex);
}
},
ex => Console.WriteLine(ex));
var subscription = source.Subscribe(observer);
我需要做什么才能让 onError 动作捕获异常?
只有在 observable 中引发异常才会被捕获。如果它们在 observer 中出现,那么你必须自己捕捉它们。
这有很多原因:
- 如果你有几个观察者连接到一个热观察者,那么你不希望流被终止,因为其中一个观察者做错了。
- 您不希望其他观察者知道其他观察者的工作
- 如果一个观察者在另一个观察者成功处理一个值后抛出异常,但在下一个观察者观察它之前,您可能会处于不一致状态。