Tôi đang cố gắng xử lý một số tác vụ không đồng bộ bằng Rx, ví dụ:Cách xử lý ngoại lệ từ các phương thức không đồng bộ trong câu lệnh SelectMany
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"); }
);
Vấn đề tôi có với mã này là ngoại lệ không được chuyển cho người đăng ký. Vì vậy, sau khi rất nhiều cố gắng tôi đã từ bỏ và quyết định đặt câu hỏi đơn giản này:
Làm thế nào để bạn xử lý các trường hợp ngoại lệ được nêu ra từ bên trong các phương thức không đồng bộ trong tuyên bố SelectMany
?
Chỉ cần làm rõ, thực hiện cuối cùng là cuộc gọi hàm đồng bộ có thể hoặc không thể ném ngoại lệ. Mục tiêu là chuyển nó cho người đăng ký để nó có thể được xử lý thêm (trong trường hợp cụ thể, một thông báo sẽ được hiển thị cho người dùng).
Sửa
tôi chuyển những phát hiện của tôi xuống đến một câu trả lời, vì vậy mà tôi có thể đánh dấu câu hỏi này như đã trả lời. Cá nhân, tôi không đồng ý với tự trả lời ... nhưng đôi khi không có cách nào khác, vì vậy xin lỗi vì nó.
Điều này có giúp trả lời câu hỏi của bạn không? http: // stackoverflow.com/questions/7210051/catch-exceptions-which-may-be-throw-from-a-subscription-onnext-action – user981225
Không chính xác như thế này ngăn chặn ngoại lệ, tuy nhiên, ý tưởng wapping có thể hữu ích, nếu không có gì tốt hơn đến Tuy nhiên, tôi không chắc liệu các gói sẽ làm việc trong kịch bản của tôi như tôi đang đối phó với nhiều cuộc gọi asynchroneous và song song ... Nhưng tôi sẽ điều tra, Cảm ơn. – AxelEckenberger
@ user981225, cảm ơn đã được chứng minh có giá trị nhưng câu trả lời khá đơn giản, hãy xem chỉnh sửa. – AxelEckenberger