Đơn đăng ký của tôi chấm dứt khi một người quan sát bị lỗi khi ObserveOn(Scheduler.ThreadPool)
phát hiện lỗi. Cách duy nhất tôi đã tìm thấy để đối phó với điều này là bằng cách sử dụng một phương pháp mở rộng tùy chỉnh dưới đây (ngoài việc đảm bảo OnNext không bao giờ ném một ngoại lệ). Và sau đó đảm bảo rằng mỗi ObserveOn
được theo sau là ExceptionToError
.Làm cách nào để xử lý ngoại lệ trong OnNext khi sử dụng ObserveOn?
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;
}
Tuy nhiên, điều này không đúng. Có cách nào tốt hơn để giải quyết vấn đề này không?
Ví dụ
Chương trình này bị treo vì ngoại lệ còn tự do.
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();
}
}
}
OnError không được gọi trong ví dụ OnError của bạn, trừ khi ExceptionToError được thêm vào (đã thử sử dụng ứng dụng bảng điều khiển và với dự án thử nghiệm đơn vị). Bạn đã thử nó chưa? Rất cám ơn sự cải tiến của ExceptionToError, tuy nhiên nó vẫn cảm thấy không tự nhiên. Có thể xử lý lỗi nên được thêm vào bộ lập lịch? Tức là một trình bao bọc SafeScheduler. – Herman
Tôi đã xem xét 'Materialize' nhưng không thấy cách tôi có thể sử dụng. OnError không được gọi mà không có 'ExceptionToError'. Thử nghiệm nó với: public static IObservable Log (IObservable nguồn) { trở source.Materialize (Chọn (n => { Trace.WriteLine ("Lỗi săn:"). + N); trở n; }). Dematerialize(); } –
Herman
@Herman - Bạn có thể cung cấp một số mã hủy bỏ lỗi của bạn không? – Enigmativity