我对Rx.NET有些新意。是否有可能捕获任何订阅者可能抛出的异常?请采取以下措施......
handler.FooStream.Subscribe(
_ => throw new Exception("Bar"),
_ => { });
目前我正在以每个订阅为基础,使用以下实例。其实现只使用ManualResetEvent来唤醒等待的线程。
public interface IExceptionCatcher
{
Action<T> Exec<T>(Action<T> action);
}
并像这样使用它......
handler.FooStream.Subscribe(
_exceptionCatcher.Exec<Foo>(_ => throw new Exception("Bar")), //It's disappointing that this generic type can't be inferred
_ => { });
我觉得必须有更好的方法。 Rx.NET中的所有错误处理功能是否专门用于处理可观察的错误?
编辑:根据请求,我的实现是https://gist.github.com/1409829(接口和实现分为prod代码中的不同程序集)。欢迎反馈。这可能看起来很愚蠢,但我正在使用城堡windsor来管理许多不同的Rx用户。此异常捕获器已在容器中注册,如此
windsorContainer.Register(Component.For<IExceptionCatcher>().Instance(catcher));
然后将使用这样的observable
是IObservable的实例:
var exceptionCatcher =
new ExceptionCatcher(e =>
{
Logger.FatalException(
"Exception caught, shutting down.", e);
// Deal with unmanaged resources here
}, false);
/*
* Normally the code below exists in some class managed by an IoC container.
* 'catcher' would be provided by the container.
*/
observable /* do some filtering, selecting, grouping etc */
.SubscribeWithExceptionCatching(processItems, catcher);
答案 0 :(得分:8)
内置的Observable操作符默认情况下不会执行您要求的操作(很像事件),但您可以使用扩展方法来执行此操作。
public static IObservable<T> IgnoreObserverExceptions<T, TException>(
this IObservable<T> source
) where TException : Exception
{
return Observable.CreateWithDisposable<T>(
o => source.Subscribe(
v => { try { o.OnNext(v); }
catch (TException) { }
},
ex => o.OnError(ex),
() => o.OnCompleted()
));
}
然后可以使用此方法包装任何observable以获得您描述的行为。