RxJava:有条件地捕获错误并停止传播

RxJava:有条件地捕获错误并停止传播,java,error-handling,rx-java,observable,retrofit2,Java,Error Handling,Rx Java,Observable,Retrofit2,我使用RxJava可观测值和lambda表达式进行改造。我是RxJava新手,无法了解如何执行以下操作: Observable<ResponseBody> res = api.getXyz(); res.subscribe(response -> { // I don't need the response here }, error -> { // I might be able to handle an error here. If so, it sh

我使用RxJava可观测值和lambda表达式进行改造。我是RxJava新手,无法了解如何执行以下操作:

Observable<ResponseBody> res = api.getXyz();
res.subscribe(response -> {
    // I don't need the response here
}, error -> {
    // I might be able to handle an error here. If so, it shall not go to the second error handler.
});
res.subscribe(response -> {
    // This is where I want to process the response
}, error -> {
    // This error handler shall only be invoked if the first error handler was not able to handle the error.
});
Observable res=api.getXyz();
res.subscribe(响应->{
//我不需要这里的回复
},错误->{
//我可能可以在这里处理错误。如果是这样,它将不会转到第二个错误处理程序。
});
res.subscribe(响应->{
//这就是我想要处理响应的地方
},错误->{
//只有当第一个错误处理程序无法处理错误时,才能调用此错误处理程序。
});

我查看了,但我不明白它们如何帮助我处理我的用例。

方法1:保留两个
订户,但
缓存
可观察的

保持现状,但将第一行更改为:

Observable<ResponseBody> res = api.getXyz().cache();
并且只订阅一次(在“外部”对象中):

这样,只有在无法在
onErrorResumeNext
中处理错误时,才会转发错误-如果可以,则
订户
只会接到一个到
onCompleted
的呼叫,而不会收到其他任何呼叫

不过,在
OneRorResumeNext
中出现副作用让我有点不舒服。:-)

编辑:哦,如果你想更加严格,你可以使用方法3:将每个案例包装到一个新对象中

public abstract class ResultOrError<T> {
}

public final class Result<T> extends ResultOrError<T> {
    public final T result;

    public Result(T result) {
        this.result = result;
    }
}

public final class HandledError<T> extends ResultOrError<T> {
    public final Throwable throwable;

    public Result(Throwable throwable) {
        this.throwable = throwable;
    }
}

public final class UnhandledError<T> extends ResultOrError<T> {
    public final Throwable throwable;

    public Result(Throwable throwable) {
        this.throwable = throwable;
    }
}
公共抽象类结果错误{
}
公共最终类结果扩展ResultError{
公开最终结果;
公开结果(T结果){
this.result=结果;
}
}
公共最终类HandledError扩展ResultError{
公众最终可抛弃;
公开结果(可丢弃可丢弃){
this.throwable=throwable;
}
}
公共最终类未处理错误扩展ResultError{
公众最终可抛弃;
公开结果(可丢弃可丢弃){
this.throwable=throwable;
}
}
然后:

  • 结果
    中包装正确的结果(使用
    映射
  • handleError
    中包装可处理的错误
  • 未处理错误中无法处理的错误
    (使用带有
    if
    子句的
    onErrorResumeNext
  • 处理
    HandledError
    s(使用
    doError
  • 拥有一个
    订户
    -它将获得所有三种类型的通知(
    onNext
    ),但只会忽略
    处理错误
    并处理其他两种类型

首先,您当前的代码将执行两次网络请求,每个订户一次-原因是改装返回“冷”观察值,仅当某些订户订阅时才会执行。除此之外,你能解释一下你想要达到的目标吗?这两个订阅在不同的类中吗?在每种情况下,“处理”错误是什么意思?而且,也许
onErrorResumeNext
是您想要的-它可以检查错误是否可以在那里“处理”,然后传递错误或执行其他操作…是的,这两个订阅属于不同的类。我尝试这样做:为api请求(-response)创建可观察的对象。然后将该可观测值传递给附加了一些通用错误处理程序的函数,并返回(或新的)可观测值。最后,订阅以获取api响应或处理任何未由通用错误处理程序处理的错误。
observable.subscribe(new Subscriber() {
    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError");
        e.printStackTrace();
    }

    @Override
    public void onNext(Object o) {
        System.out.println(String.format("onNext: %s", String.valueOf(o)));
    }    

});
public abstract class ResultOrError<T> {
}

public final class Result<T> extends ResultOrError<T> {
    public final T result;

    public Result(T result) {
        this.result = result;
    }
}

public final class HandledError<T> extends ResultOrError<T> {
    public final Throwable throwable;

    public Result(Throwable throwable) {
        this.throwable = throwable;
    }
}

public final class UnhandledError<T> extends ResultOrError<T> {
    public final Throwable throwable;

    public Result(Throwable throwable) {
        this.throwable = throwable;
    }
}