Перехват исключений, которые могут быть вызваны действием подписки OnNext

Я новичок в Rx.NET. Можно ли поймать исключение, которое может быть сгенерировано любым из подписчиков? Возьмем следующее ...

handler.FooStream.Subscribe(
            _ => throw new Exception("Bar"),
            _ => { });

В настоящее время я ловлю на основе каждой подписки пример следующего: Реализация которого просто использует ManualResetEvent для пробуждения ожидающего потока.

public interface IExceptionCatcher
{
    Action Exec(Action action);
}

и использую его таким образом. ..

handler.FooStream.Subscribe(
            _exceptionCatcher.Exec(_ => throw new Exception("Bar")), //It's disappointing that this generic type can't be inferred
            _ => { });

Я чувствую, что должен быть какой-то лучший способ. Все ли возможности обработки ошибок в Rx.NET специально для работы с наблюдаемыми ошибками?

РЕДАКТИРОВАТЬ: На запрос, моя реализация - https: / /gist.github.com/1409829 (интерфейс и реализация разделены на разные сборки в коде продукта). Обратная связь приветствуется. Это может показаться глупым, но я использую Castle Windsor для управления множеством разных подписчиков Rx. Этот ловушка исключений регистрируется в контейнере следующим образом

windsorContainer.Register(Component.For().Instance(catcher));

Затем он будет использоваться так, где наблюдаемый является экземпляром e of 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);

9
задан drstevens 30 November 2011 в 18:00
поделиться