RxJava 中无内置 ProcessException,它是项目自定义异常;需继承 RuntimeException 确保传播到 onError,并在 subscribe 中用 instanceof 判断类型进行差异化处理。

在 RxJava 中并没有内置的 ProcessException 类,它不是 Java 标准异常,也不是 RxJava 自带的异常类型。你遇到的很可能是项目中自定义的异常类(比如叫 ProcessException),用于封装业务处理失败的场景。要在 onError 中正确处理这类自定义异常,关键在于:**确保它被抛出时未被上游吞掉,并在订阅时针对性捕获和区分处理。**
确认异常是否真的到达 onError
RxJava 的 Observable/Flowable 等在发生非检查异常(unchecked exception)时会自动终止并触发 onError;但如果是检查异常(checked exception),且你用了类似 map 这样的操作符又没用 try-catch 包裹,就会编译报错或被包装成 OnErrorNotImplementedException —— 此时你的 ProcessException 可能根本没传到 onError。
- 如果你的
ProcessException是继承RuntimeException(推荐),那它属于 unchecked 异常,可直接 throw,会被 RxJava 捕获并传递给onError - 如果它是 checked 异常(继承
Exception),必须在操作符内部用try-catch转为 unchecked 异常再抛出,例如:throw new RuntimeException(e);或包装为CompositeException - 避免在
doOnNext、doOnError等副作用操作中静默吞掉异常(比如空 catch 块),否则onError不会被调用
在 subscribe 的 onError 中识别并处理 ProcessException
订阅时,onError 接收的是 Throwable,你需要手动判断类型并做差异化处理:
- 用
instanceof判断是否为ProcessException - 提取自定义字段(如 error code、message、retryable 标志等)进行 UI 提示或重试逻辑
- 对其他异常(如
IOException、NullPointerException)走兜底处理(打日志、Toast 通用错误)
示例:
立即学习“Java免费学习笔记(深入)”;
observable.subscribe(
data -> { /* success */ },
error -> {
if (error instanceof ProcessException) {
ProcessException pe = (ProcessException) error;
showCustomTip(pe.getErrorCode(), pe.getMessage());
if (pe.isRetryable()) {
retryButton.setVisibility(View.VISIBLE);
}
} else {
Log.e("Rx", "Unexpected error", error);
showToast("网络或系统异常,请稍后重试");
}
}
);用 onErrorResumeNext / onErrorReturn 更优雅地转换异常流
如果希望把 ProcessException 转为某种默认值或降级结果(而不是终止流),可用错误恢复操作符:
-
onErrorResumeNext(Function<Throwable, ObservableSource<T>>):根据异常类型返回新的 Observable(如 fallback 数据、空列表、缓存数据) -
onErrorReturn:直接返回一个固定值(适合简单兜底) - 注意:这些操作符只对上游抛出的异常生效,仍需确保
ProcessException能顺利抵达此处
示例(返回空列表):
observable
.onErrorResumeNext(throwable -> {
if (throwable instanceof ProcessException) {
return Observable.just(Collections.emptyList());
}
return Observable.error(throwable);
})
.subscribe(list -> handleList(list));配合 doOnError 做统一异常预处理
若多个地方都可能抛出 ProcessException,可在链路中提前用 doOnError 统一记录或增强信息:
-
doOnError不改变流行为,仅执行副作用,适合打日志、上报、修改状态 - 可结合
filter+materialize实现更精细的错误分类,但日常开发中instanceof已足够清晰
示例:
立即学习“Java免费学习笔记(深入)”;
observable
.doOnError(error -> {
if (error instanceof ProcessException) {
CrashReport.report("BusinessProcessFailed", error);
}
})
.subscribe(...);不复杂但容易忽略的是异常类型的设计和传播路径。只要 ProcessException 是 runtime 异常、没被中间层吃掉、订阅时做类型判断,就能干净地在 onError 里完成定制化处理。


















