1.操作符
- onErrorResumeNext
- onErrorReturn
- onExceptionResumeNext
2.操作符案例
2.1 onErrorResumeNext
说明
拦截发射的异常 ,能够处理 throw Exception级别的异常,能够接收异常消息,需要返回一个新的Observable,执行发送 ,不能处理 throw Error级别异常
例子
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
throw new RuntimeException("hahahhaa"); // 下游onErrorResumeNext 能够处理
// throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理
}
})
.onErrorResumeNext(new Function<Throwable, ObservableSource<? extends String>>() {
@Override
public ObservableSource<? extends String> apply(Throwable throwable) throws Exception {
throwable.printStackTrace();
return Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("4");
emitter.onNext("5");
emitter.onNext("6");
}
});
}
})
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: " + e);
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete: ");
}
});
输出信息 (发送完成以后 手动抛出异常,能够被onErrorResumeNext 捕获,并且在里面创建了一个新的Observable,继续发送)
10-25 05:50:17.772 I/MainActivity: onNext: 1
10-25 05:50:17.772 I/MainActivity: onNext: 2
10-25 05:50:17.772 I/MainActivity: onNext: 3
10-25 05:50:17.772 W/System.err: java.lang.RuntimeException: hahahhaa
10-25 05:50:17.772 W/System.err: at com.xiaxiayige.rxjavademo.MainActivity$36.subscribe(MainActivity.java:719)
10-25 05:50:17.772 W/System.err: at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
10-25 05:50:17.772 W/System.err: at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:50:17.772 W/System.err: at io.reactivex.internal.operators.observable.ObservableOnErrorNext.subscribeActual(ObservableOnErrorNext.java:38)
10-25 05:50:17.772 W/System.err: at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:50:17.772 W/System.err: at com.xiaxiayige.rxjavademo.MainActivity.aa24(MainActivity.java:738)
10-25 05:50:17.772 W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:50:17.772 W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:50:17.772 W/System.err: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
10-25 05:50:17.772 W/System.err: at android.view.View.performClick(View.java:4204)
10-25 05:50:17.772 W/System.err: at android.view.View$PerformClick.run(View.java:17355)
10-25 05:50:17.772 W/System.err: at android.os.Handler.handleCallback(Handler.java:725)
10-25 05:50:17.772 W/System.err: at android.os.Handler.dispatchMessage(Handler.java:92)
10-25 05:50:17.772 W/System.err: at android.os.Looper.loop(Looper.java:137)
10-25 05:50:17.772 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 05:50:17.772 W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:50:17.772 W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:50:17.772 W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 05:50:17.772 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 05:50:17.772 W/System.err: at dalvik.system.NativeStart.main(Native Method)
10-25 05:50:17.772 I/MainActivonErrorResumeNextity: onNext: 4
10-25 05:50:17.772 I/MainActivity: onNext: 5
10-25 05:50:17.772 I/MainActivity: onNext: 6
2.2 onErrorReturn
说明
拦截发射的异常,能够处理 throw Execption级别异常 ,能够接收异常消息,可以提供返回一个默认值,但是不能处理 throw Error级别异常
例子
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
throw new RuntimeException("hahahhaa"); // 下游onErrorReturn 能够处理
// throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理
}
})
.onErrorReturn(new Function<Throwable, String>() {
@Override
public String apply(Throwable throwable) throws Exception {
throwable.printStackTrace();
return "default";
}
})
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: " + e);
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete: ");
}
});
输出结果
10-25 05:56:24.220 I/MainActivity: onNext: 1
10-25 05:56:24.220 I/MainActivity: onNext: 2
10-25 05:56:24.220 I/MainActivity: onNext: 3
10-25 05:56:24.220 W/System.err: java.lang.RuntimeException: hahahhaa
10-25 05:56:24.224 W/System.err: at com.xiaxiayige.rxjavademo.MainActivity$39.subscribe(MainActivity.java:769)
10-25 05:56:24.224 W/System.err: at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
10-25 05:56:24.224 W/System.err: at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:56:24.224 W/System.err: at io.reactivex.internal.operators.observable.ObservableOnErrorReturn.subscribeActual(ObservableOnErrorReturn.java:31)
10-25 05:56:24.224 W/System.err: at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:56:24.224 W/System.err: at com.xiaxiayige.rxjavademo.MainActivity.aa25(MainActivity.java:780)
10-25 05:56:24.224 W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:56:24.224 W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:56:24.224 W/System.err: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
10-25 05:56:24.224 W/System.err: at android.view.View.performClick(View.java:4204)
10-25 05:56:24.224 W/System.err: at android.view.View$PerformClick.run(View.java:17355)
10-25 05:56:24.228 W/System.err: at android.os.Handler.handleCallback(Handler.java:725)
10-25 05:56:24.228 W/System.err: at android.os.Handler.dispatchMessage(Handler.java:92)
10-25 05:56:24.228 W/System.err: at android.os.Looper.loop(Looper.java:137)
10-25 05:56:24.228 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 05:56:24.228 W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:56:24.228 W/System.err: at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:56:24.228 W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 05:56:24.228 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 05:56:24.228 W/System.err: at dalvik.system.NativeStart.main(Native Method)
10-25 05:56:24.228 I/MainActivity: onNext: default
10-25 05:56:24.228 I/MainActivity: onComplete:
2.3 onExceptionResumeNext
说明
拦截发射的异常,能够处理 throw Execption级别异常 不接受异常信息,获得Observer继续发送,同样不能处理 Error级别的异常
例子
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
throw new RuntimeException("hahahhaa"); // 下游onErrorReturn 能够处理
// throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理
}
})
.onExceptionResumeNext(new ObservableSource<String>() {
@Override
public void subscribe(Observer<? super String> observer) {
observer.onNext("4");
observer.onNext("5");
observer.onNext("6");
}
})
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.i(TAG, "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: " + e);
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete: ");
}
});
输出结果 这里抛出了异常,但是接收的地方并没有告知是什么异常,我们可以不用处理。正常执行我们的操作即可
10-25 05:54:48.004 I/MainActivity: onNext: 1
10-25 05:54:48.004 I/MainActivity: onNext: 2
10-25 05:54:48.004 I/MainActivity: onNext: 3
10-25 05:54:48.004 I/MainActivity: onNext: 4
10-25 05:54:48.004 I/MainActivity: onNext: 5
10-25 05:54:48.004 I/MainActivity: onNext: 6
3.总结对比
1. 都不能处理Error级别的错误,
2. 都能拦截到上游的异常
onErrorResumeNext 拦截发射的异常 ,能够处理 throw Exception级别的异常,能够接收异常消息,需要返回一个新的Observable,执行发送 ,不能处理 throw Error级别异常
onErrorReturn 拦截发射的异常,能够处理 throw Execption级别异常 ,能够接收异常消息,可以提供返回一个默认值,但是不能处理 throw Error级别异常
onExceptionResumeNext 拦截发射的异常,能够处理 throw Execption级别异常 不接受异常信息,获得Observer继续发送,同样不能处理 Error级别的异常