寻找一种干净的方法来处理RxJava中的错误

寻找一种干净的方法来处理RxJava中的错误,java,rx-java,Java,Rx Java,我正在学习RxJava,我在很多地方都看到错误可以通过这种方式处理: repository.getById(10).subscribe(new Action1<User>() { @Override public void call(User user) { //Do something } }, new Action1<Throwable>() {

我正在学习RxJava,我在很多地方都看到错误可以通过这种方式处理:

repository.getById(10).subscribe(new Action1<User>() {
            @Override
            public void call(User user) {
              //Do something
            }
        }, new Action1<Throwable>() {
            @Override
            public void call(Throwable t) {
                if (t instanceof FirstErrorException) {
                    handleFirstError((FirstErrorException) t);
                } else if (t instanceof FirstErrorException) {
                    handleSecondError((SecondErrorException) t);
                } else {
                    //and so on... 
                }
            }
        });
repository.getById(10).subscribe(新操作1(){
@凌驾
公共作废调用(用户){
//做点什么
}
},新行动1(){
@凌驾
公共无效呼叫(可丢弃的t){
if(FirstErrorException的t实例){
handleFirstError((FirstErrorException)t);
}else if(FirstErrorException的t实例){
handleSecondError((SecondErrorException)t);
}否则{
//等等。。。
}
}
});

我是唯一一个认为这是非常糟糕的代码的人吗?我怎样才能做得更好?我认为使用
Visitor
模式“访问”我的基本异常的每个具体类型,但是
onError
方法总是需要
Action1
;您不能使用自己的基本异常,只需使用可丢弃的错误处理程序即可:

 <T,E extends Throwable> Observable<T>
 whenExceptionIs(Class<E> what, Func1<E,Observable<T>> result) {
     return t -> {
        return what.isInstance(t) ? result.call(t) : Observable.error(t);
     };
 }
可观察
whenExceptionIs(类what,函数1结果){
返回t->{
返回什么.isInstance(t)?result.call(t):可观察的.error(t);
};
}
您使用的是这样的:

Observable<Foo> obs = ...
    .onErrorResumeNext(whenExceptionIs(IllegalArgumentException.class, t-> Observable.just(Foo.newInstance())))
    .onErrorResumeNext(whenExceptionIs(IOException.class, t-> Observable.error(new XyzzyException("",t))))
 ....
可观测obs=。。。
.onErrorResumeNext(whenExceptionIs(IllegalArgumentException.class,t->Observable.just(Foo.newInstance()))
.onErrorResumeNext(whenExceptionIs(IOException.class,t->Observable.error(新的XyzzyException(“,t)))
....

我应该将错误处理程序(whenExceptionIs)放在哪里,以便代码全局可用?在它自己的类中作为静态方法?是的;我有一个班级,他们的名字都很合理。好的,谢谢。宿主类也是静态的,还是仅仅是方法名?例如:公共类实用程序{public static observeable whenExceptionIs(…}我在whenExceptionIs()前面没有看到“public static”声明,所以我有点困惑。另外,当我尝试使用该错误处理程序构建类时,我收到了一条错误消息。我在这里发了一篇帖子:天哪,我真的无法理解泛型转换来构建这样一个函数!因为这种形式显然不起作用(返回类型是可观察的,但在lambda中描述了).如果有人能在这里为这样的事情写一个真实的工作示例,请:)