在 RxJava 中,异常处理的本质是:一旦链上发生错误(onError),整个流就会终止。因此常见的做法是“捕获、恢复、或兜底”,而不是让错误直接穿透到订阅者导致崩溃。
下面按使用频率从高到低介绍几种常见处理方式。
onErrorReturn:发生错误时返回一个默认值Observable.just(1, 2, 0)
.map(i -> 10 / i)
.onErrorReturn(throwable -> -1)
.subscribe(
v -> Log.d("TAG", "value=" + v),
e -> Log.e("TAG", "error", e)
);
✅ 错误后 流不会中断,直接发射一个兜底值
onErrorResumeWith / onErrorResumeNext:错误时切换到另一个 ObservableObservable.error(new RuntimeException("error"))
.onErrorResumeWith(Observable.just(100, 200))
.subscribe(System.out::println);
适合:
retry:重试Observable.error(new RuntimeException())
.retry(3)
.subscribe();
.retryWhen(errors ->
errors.zipWith(Observable.range(1, 3), (e, i) -> i)
.flatMap(i -> Observable.timer(1, TimeUnit.SECONDS))
);
✅ 常用于网络请求重试
doOnError:只做副作用(不恢复)Observable.error(new RuntimeException("oops"))
.doOnError(e -> Log.e("TAG", "发生错误", e))
.subscribe();
⚠️ 不会阻止 onError 继续传递
subscribe 的 onError 回调(最基础).subscribe(
value -> { },
error -> {
// 处理异常,防止崩溃
}
);
⚠️ 如果 不写 onError,RxJava 会抛 OnErrorNotImplementedException
RxJavaPlugins.setErrorHandler(throwable -> {
Log.e("RX", "未捕获异常", throwable);
});
适合:
flatMap / map 中 try-catch(不推荐).map(i -> {
try {
return 10 / i;
} catch (Exception e) {
return -1;
}
});
✅ 简单
❌ 破坏响应式风格
| 场景 | 推荐方式 |
|---|---|
| 返回默认值 | onErrorReturn |
| 切换数据源 | onErrorResumeWith |
| 网络重试 | retry / retryWhen |
| 日志 / 上报 | doOnError |
| 最终兜底 | subscribe(onError) |
如果你愿意,可以告诉我:
我可以给你更贴合的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。