如何在 RxJava 的 onNext() 中抛出错误?

18
.subscribe(
    new Action1<Response>() {
        @Override
        public void call(Response response) {
            if (response.isSuccess())
            //handle success
            else
            //throw an Throwable(reponse.getMessage())
        }
    },
    new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {
            //handle Throwable throw from onNext();
        }
    }
);

我不想在onNext()中处理(!response.isSuccess())。我该如何将其抛到onError()并与其他throwable一起处理?

3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
19
如果FailureException扩展自RuntimeException,那么
.doOnNext(response -> {
  if(!response.isSuccess())
    throw new FailureException(response.getMessage());
})
.subscribe(
    item  -> { /* handle success */ },
    error -> { /* handle failure */ }
);

如果尽早抛出异常,那么您可以轻松进行重试、备用响应等操作,这是最有效的方法。


1
当RuntimeException扩展的异常被抛出时,它们不会由RxJava处理而崩溃,这是正确的吗? - neteinstein

15

你可以对响应使用flatMap函数,以返回Response或Error。

flatMap(new Func1<Response, Observable<Response>>() {
    @Override
    public Observable<Response> call(Response response) {
        if(response.isSuccess()){
            return Observable.just(response);
        } else {
            return Observable.error(new Throwable(response.getMessage()));
        }
    }
})

2
解决方案是在中间添加一个运算符。我的建议是使用map,因为它不会生成新的Observable对象(与flatMap相比)。
.map(new Func1<Response, Response>() {
    @Override
    public Response call(Response response) {
        if (response.isSuccess()) {
            return response;
        } else {
            throw new Throwable(reponse.getMessage()));
        }
    }
 })

注意:map 函数确实会创建一个新的可观察对象,只是它会在内部为你完成。 - cyroxis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,