温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

rxjava怎么处理异常

发布时间:2026-10-11 06:15:32 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 RxJava 中,异常处理的本质是:一旦链上发生错误(onError),整个流就会终止。因此常见的做法是“捕获、恢复、或兜底”,而不是让错误直接穿透到订阅者导致崩溃。

下面按使用频率从高到低介绍几种常见处理方式。


1. 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)
    );

✅ 错误后 流不会中断,直接发射一个兜底值


2. onErrorResumeWith / onErrorResumeNext:错误时切换到另一个 Observable

Observable.error(new RuntimeException("error"))
    .onErrorResumeWith(Observable.just(100, 200))
    .subscribe(System.out::println);

适合:

  • 网络失败 → 读取缓存
  • 主接口失败 → 备用接口

3. 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))
);

✅ 常用于网络请求重试


4. doOnError:只做副作用(不恢复)

Observable.error(new RuntimeException("oops"))
    .doOnError(e -> Log.e("TAG", "发生错误", e))
    .subscribe();

⚠️ 不会阻止 onError 继续传递


5. subscribe 的 onError 回调(最基础)

.subscribe(
    value -> { },
    error -> {
        // 处理异常,防止崩溃
    }
);

⚠️ 如果 不写 onError,RxJava 会抛 OnErrorNotImplementedException


6. 全局异常兜底(不推荐但有用)

RxJavaPlugins.setErrorHandler(throwable -> {
    Log.e("RX", "未捕获异常", throwable);
});

适合:

  • 防止 App 崩溃
  • 统一上报崩溃

7. 在 flatMap / map 中 try-catch(不推荐)

.map(i -> {
    try {
        return 10 / i;
    } catch (Exception e) {
        return -1;
    }
});

✅ 简单
❌ 破坏响应式风格


✅ 推荐实践总结

场景 推荐方式
返回默认值 onErrorReturn
切换数据源 onErrorResumeWith
网络重试 retry / retryWhen
日志 / 上报 doOnError
最终兜底 subscribe(onError)

如果你愿意,可以告诉我:

  • 用的是 RxJava2 还是 3
  • 场景(网络请求 / 数据库 / UI 事件)
  • 是否结合 Retrofit / LiveData

我可以给你更贴合的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手