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

时间:2016-08-19 16:12:30

标签: java rx-java

我正在学习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... 
                }
            }
        });

我是唯一一个认为这是非常糟糕的代码吗?我怎样才能让它变得更好?我虽然使用Visitor模式&#34;访问&#34;我的基本异常的每种具体类型,但onError方法始终需要Action1<Throwable>;您无法使用自己的基本例外,只需Throwable

1 个答案:

答案 0 :(得分:6)

救援的错误处理程序:

 <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);
     };
 }

你这样使用:

Observable<Foo> obs = ...
    .onErrorResumeNext(whenExceptionIs(IllegalArgumentException.class, t-> Observable.just(Foo.newInstance())))
    .onErrorResumeNext(whenExceptionIs(IOException.class, t-> Observable.error(new XyzzyException("",t))))
 ....