如果我在订阅期间有异常怎么办?

时间:2017-01-26 10:12:15

标签: java rx-java reactivex subscriber

我正在尝试将“第三方”发布商包装到RxJava中。在订阅期间,我正在准备发布者,这可能会导致例外(当发布者不可用时)。

我应该怎么处理异常?

1)从subscribe方法中抛出它?

2)将其推入观察者的OnError方法?

3)还有别的吗?

我正在考虑推送到OnError,然后如何实现订阅?如果OnError应该是订阅中的最后一个事件,我应该考虑订阅是否发生?什么归还Subscription?只是NOP lambda?

2 个答案:

答案 0 :(得分:1)

“发布者”和“换行”的含义有点不清楚。

例如,有一个返回Observable的API调用,但调用本身可能会抛出未经检查的异常。一种简单的方法是使用defer来捕获该异常并将其转发给订阅者:

Observable.defer(() -> api.unreliableMethod())...

如果您的意思是拥有Reactive-Streams Publisher和RxJava 2,则只需拨打Flowable.fromPublisher或再次Flowable.defer(() -> publisher),就像上面一样。

否则,RxJavaReactiveStreams允许您将Publisher转换为Observable(并推迟()过程以捕获异常(如果需要):

Observable.defer(() ->
    RxJavaReactiveStreams.toObservable(api.unreliablePublisher()))...

答案 1 :(得分:0)

  

我正在考虑推送OnError,然后如何实现订阅?如果OnError应该是订阅中的最后一个事件,我应该认为订阅是否发生?什么归还订阅?刚刚NOP lambda?

这实际上是RxJava本身通常如何处理'构造函数中的异常。每个运营商。

如果您正在使用RxJava2,那么您需要记住一条额外的规则。这就是Subscriber.onSubcribe()onError之前必须始终调用onComplete,所以即使它立即抛出异常,也必须调用onSubscribeonError