Как обрабатывать исключения из асинхронных методов в операторе SelectMany

Я пытаюсь обработать некоторые задачи асинхронно, используя Rx, например

var list = Enumerable.Range(0, 100)
    .ToObservable()
    .SelectMany(x => Observable.Start(() => {
        Console.WriteLine("Processing {0} ...", x);

        Thread.Sleep(100 * x % 3);

        if (x > 90) {
            Console.WriteLine("Procesing exception {0} > 90", x);
            throw new Exception("Value too large");
        }
        Console.WriteLine("Processing {0} completed.", x);
        return x;
    }))
    .Subscribe(
        x => { Console.WriteLine("Next [{0}]", x); },
        e => {
            Console.WriteLine("Exception:");
            Console.WriteLine(e.Message);
        },
        () => { Console.WriteLine("Complete"); }
    );

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

Как вы справляетесь с исключения, возникающие из асинхронных методов в операторе SelectMany?

Просто чтобы было ясно, окончательная реализация представляет собой синхронный вызов функции, который может генерировать или не генерировать исключение. Цель состоит в том, чтобы передать его подписчику для дальнейшей обработки (в конкретном случае пользователю будет показано сообщение)

Изменить

Я переместил свои выводы вниз к ответу, чтобы я мог пометить этот вопрос как отвеченный .Лично я не согласен с самостоятельным ответом... но иногда другого пути нет, так что извините за это.

5
задан AxelEckenberger 11 March 2012 в 11:15
поделиться