tức là, bằng cách chuyển điều kiện lỗi và không dừng toàn bộ Chế độ có thể quan sát?Rx Observable có thể xử lý ngoại lệ một cách duyên dáng trong một toán tử và tiếp tục không?
Quan sát của tôi bắt đầu bằng danh sách số theo dõi gói do người dùng cung cấp từ các dịch vụ chuyển phát thường (FedEx, UPS, DHL, v.v.), tra cứu ngày giao hàng dự kiến trực tuyến, sau đó trả về ngày đó theo số ngày từ hôm nay (nghĩa là "trong 3 ngày" thay vì "ngày 22 tháng 1"). Vấn đề là nếu bất kỳ tra cứu cá nhân nào dẫn đến một ngoại lệ, toàn bộ luồng sẽ dừng và phần còn lại của các mã sẽ không được tra cứu. Không có khả năng xử lý một cách duyên dáng, ví dụ: UnknownTrackingCode Exception
và vì vậy Đài quan sát không thể đảm bảo rằng nó sẽ tra cứu tất cả các mã mà người dùng đã gửi.
public void getDaysTillDelivery(List<String> tracking_code_list) {
Observable o = Observable.from(tracking_code_list)
// LookupDeliveryDate performs network calls to UPS, FedEx, USPS web sites or APIs
// it might throw: UnknownTrackingCode Exception, NoResponse Exception, LostPackage Exception
.map(tracking_code -> LookupDeliveryDate(tracking_code))
.map(delivery_date -> CalculateDaysFromToday(delivery_date));
o.subscribe(mySubscriber); // will handle onNext, onError, onComplete
}
Ngăn chặn dòng Quan sát là kết quả của một lỗi là do thiết kế:
- http://reactivex.io/documentation/operators/catch.html
- Handling Exceptions in Reactive Extensions without stopping sequence
- https://groups.google.com/forum/#!topic/rxjava/trm2n6S4FSc
Hành vi mặc định có thể được khắc phục , nhưng chỉ bằng cách loại bỏ rất nhiều các lợi ích của Rx ở nơi đầu tiên:
- tôi có thể quấn
LookupDeliveryDate
để nó trả về Ngày thay Exceptions (như1899-12-31
choUnknownTrackingCode Exception
) nhưng điều này ngăn cản "mã lỏng lẻo", bởi vìCalculateDaysFromToday
sẽ cần phải xử lý những trường hợp đặc biệt - tôi có thể bao quanh mỗi chức năng ẩn danh với
try/catch
và khối, nhưng điều này chủ yếu ngăn cản tôi từ việc sử dụng lambdas - tôi có thể sử dụng
if/thens
chỉ đạo con đường mã, nhưng điều này sẽ có khả năng đòi hỏi phải duy trì một số nhà nước và loại bỏ đánh giá xác định - Lỗi xử lý từng bước, rõ ràng, ngăn củng cố tất cả các lỗi xử lý trong
Subscriber
- Viết điều hành lỗi xử lý riêng của tôi là có thể, nhưng mỏng ghi
Có cách nào tốt hơn để xử lý này?
_Bạn muốn chính xác điều gì xảy ra nếu có lỗi? _ Lý tưởng nhất, một cái gì đó như 'onItemError()' trong Thuê bao có thể được viết để bao gồm các loại ngoại lệ có thể biết được trên cơ sở từng mục, trong khi Người quan sát tiếp tục xử lý luồng. Kể từ khi đăng bài, tôi đã đọc nhiều hơn và điều này có thể được mô phỏng bằng 'flatMap''ing mỗi chuỗi mã theo dõi thành một mục' Quan sát ', do đó, bây giờ' onError' hoặc 'onComplete' được gọi cho mọi mục. Hack-ish, nhưng có thể làm việc. –
ExactaBox
Tôi đánh giá cao đề xuất của bạn và muốn giải quyết chúng: Sửa đổi các hành động hạ lưu - có thể hoạt động nhưng vi phạm khái niệm "lỏng lẻo" và các chức năng hành động không phải lúc nào cũng được thay đổi. Lọc ra các lỗi - có thể trong các luồng công việc nhất định, nhưng không thể chấp nhận được khi một phản hồi được mong đợi cho mọi đầu vào. Đối tượng 'Cả hai '- không phải là bản địa của Java 7 (Android), và bạn mất các lambdas một dòng, nhưng về mặt khái niệm thì nó có vẻ ít hack-ish và nhẹ hơn việc chuyển đổi một chuỗi' Chuỗi' thành một dòng 'Observable' , mỗi yêu cầu phải có một đăng ký duy nhất. Cảm ơn bạn! –
ExactaBox
Có Hoặc không tồn tại trong C#. Bạn sẽ cần phải cuộn phiên bản của riêng bạn về khái niệm lớp học đó. – Brandon