OnNext
を使用するときにオブザーバーによってエラーがスローされると、アプリケーションは終了しますObserveOn(Scheduler.ThreadPool)
。これに対処するために私が見つけた唯一の方法は、以下のカスタム拡張メソッドを使用することです(OnNextが例外をスローしないようにすることは別として)。そして、それぞれの後に。ObserveOn
が続くことを確認しExceptionToError
ます。
public static IObservable<T> ExceptionToError<T>(this IObservable<T> source) {
var sub = new Subject<T>();
source.Subscribe(i => {
try {
sub.OnNext(i);
} catch (Exception err) {
sub.OnError(err);
}
}
, e => sub.OnError(e), () => sub.OnCompleted());
return sub;
}
しかし、これは正しく感じられません。これに対処するためのより良い方法はありますか?
例
キャッチされない例外が原因で、このプログラムがクラッシュします。
class Program {
static void Main(string[] args) {
try {
var xs = new Subject<int>();
xs.ObserveOn(Scheduler.ThreadPool).Subscribe(x => {
Console.WriteLine(x);
if (x % 5 == 0) {
throw new System.Exception("Bang!");
}
}, ex => Console.WriteLine("Caught:" + ex.Message)); // <- not reached
xs.OnNext(1);
xs.OnNext(2);
xs.OnNext(3);
xs.OnNext(4);
xs.OnNext(5);
} catch (Exception e) {
Console.WriteLine("Caught : " + e.Message); // <- also not reached
} finally {
Console.ReadKey();
}
}
}