Добавление в селектор не то же самое, что OnError'ing. Некоторые операторы, такие как Start, упаковывают ваш код в try / catch и маршалируют в OnError, но большинство этого не делают. Представьте, что каждый LINQ Select был обернут в попытку / поймать! Это было бы довольно медленно. То же самое касается вашей подписки OnNext.
Если вы хотите создать версию Select, которая имела такое поведение, вот способ сделать это:
public static IObservable<TRet> SafeSelect(this IObservable<T> This, Func<T,TRet> selector)
{
return This.SelectMany(x => {
try {
return Observable.Return(selector(x));
} catch (Exception ex) {
return Observable.Throw<TRet>(ex);
}
});
}