异常捕获相关的操作符 以及 官方介绍

RxJava 异常捕获操作符 官方介绍 : Error Handling Operators

doOnError

出现错误会先走 doOnError 的回调,然后才走 onError .

官方示例:

Observable.error(new IOException("Something went wrong"))
        .doOnError(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable error) throws Exception {
                System.err.println("The error message is: " + error.getMessage());
        .subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                System.out.println("onNext should never be printed!");
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                throwable.printStackTrace();
        }, new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("onComplete should never be printed!");
The error message is: Something went wrong
java.io.IOException: Something went wrong
	at io.reactivex.android.samples.Test.main(Test.java:15)
onErrorComplete

io.reactivex.functions.Predicate 可以将 error事件 修正为 complete事件

官方示例:

Completable.fromAction(new Action() {
    @Override
    public void run() throws Exception {
        throw new IOException();
}).onErrorComplete(new Predicate<Throwable>() {
    @Override
    public boolean test(Throwable throwable) throws Exception {
        return throwable instanceof IOException;
}).subscribe(
        new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("IOException was ignored");
        new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.err.println("onError should not be printed!");
IOException was ignored
onErrorResumeNext

官方示例:

Observable<Integer> numbers = Observable.generate(new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
        return 1;
}, new BiFunction<Integer, Emitter<Integer>, Integer>() {
    @Override
    public Integer apply(Integer state, Emitter<Integer> emitter) throws Exception {
        emitter.onNext(state);
        return state + 1;
numbers.scan(new BiFunction<Integer, Integer, Integer>() {
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public Integer apply(Integer i1, Integer i2) throws Exception {
        return Math.multiplyExact(i1, i2);
}).onErrorResumeNext(new ObservableSource<Integer>() {
    @Override
    public void subscribe(Observer<? super Integer> observer) {
        Observable.empty();
}).subscribe(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) throws Exception {
        System.out.println(integer);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        System.err.println("onError should not be printed!");
40320
362880
3628800
39916800
479001600
onErrorReturn

当出现 error 事件的时候, 走onErrorReturn回调之后 直接onComplete

官方示例:

Observable.just("1", "2", "2A", "3")
        .map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) throws Exception {
                return Integer.parseInt(s, 10);
        .onErrorReturn(new Function<Throwable, Integer>() {
            @Override
            public Integer apply(Throwable throwable) throws Exception {
                if (throwable instanceof NumberFormatException) {
                    return 0;
                } else {
                    throw new IllegalArgumentException();
        }).subscribe(
        new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.err.println("onError should not be printed!");
onErrorReturnItem

当出现 error 事件的时候, 传递onErrorReturnItem的参数给 onNext 之后 直接onComplete

官方示例:

Observable.just("1", "2", "2A", "3")
        .map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) throws Exception {
                return Integer.parseInt(s, 10);
        .onErrorReturnItem(100)
        .subscribe(
                new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        System.out.println(integer);
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        System.err.println("onError should not be printed!");
onExceptionResumeNext

官方示例:

Observable<String> exception = Observable.<String>error(new IOException())
        .onExceptionResumeNext(new ObservableSource<String>() {
            @Override
            public void subscribe(Observer<? super String> observer) {
                Observable.just("This value will be used to recover from the IOException");
Observable<String> error = Observable.<String>error(new Error())
        .onExceptionResumeNext(new ObservableSource<String>() {
            @Override
            public void subscribe(Observer<? super String> observer) {
                Observable.just("This value will not be used");
Observable.concat(exception, error)
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println("onNext: " + s);
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.err.println("onError: " + throwable);
onNext: This value will be used to recover from the IOException
onError: java.lang.Error
retry

遇到 error 事件 根据 retry 的回调来确定是否重试。

官方示例:

Observable<Long> source = Observable.interval(0, 1, TimeUnit.SECONDS)
        .flatMap(new Function<Long, ObservableSource<Long>>() {
            @Override
            public ObservableSource<Long> apply(Long x) throws Exception {
                if (x >= 2) {
                    return Observable.error(new IOException("Something went wrong!"));
                } else {
                    return Observable.just(x);
source.retry(new BiPredicate<Integer, Throwable>() {
    @Override
    public boolean test(Integer integer, Throwable throwable) throws Exception {
        return integer < 3;
}).blockingSubscribe(new Consumer<Long>() {
    @Override
    public void accept(Long x) throws Exception {
        System.out.println("onNext: " + x);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        System.out.println(throwable.getMessage());
onNext: 1
onNext: 0
onNext: 1
onNext: 0
onNext: 1
Something went wrong!
retryUntil

遇到 error 事件 根据 retryUntil 的回调来确定是否重试。

官方示例:

final LongAdder errorCounter = new LongAdder();
Observable<Long> source = Observable.interval(0, 1, TimeUnit.SECONDS)
        .flatMap(new Function<Long, ObservableSource<Long>>() {
            @Override
            public ObservableSource<Long> apply(Long x) throws Exception {
                if (x >= 2) {
                    return Observable.error(new IOException("Something went wrong!"));
                } else {
                    return Observable.just(x);
        }).doOnError(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                errorCounter.increment();
source.retryUntil(new BooleanSupplier() {
    @Override
    public boolean getAsBoolean() throws Exception {
        return errorCounter.intValue() >= 3;
}).blockingSubscribe(new Consumer<Long>() {
    @Override
    public void accept(Long x) throws Exception {
        System.out.println("onNext: " + x);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        System.out.println(throwable.getMessage());
onNext: 0
onNext: 1
onNext: 0
onNext: 1
onNext: 0
onNext: 1
Something went wrong!
retryWhen

遇到 error 事件 根据 retryWhen 的回调来确定是否重试。

官方示例:

Observable<Long> source = Observable.interval(0, 1, TimeUnit.SECONDS)
        .flatMap(new Function<Long, ObservableSource<Long>>() {
            @Override
            public ObservableSource<Long> apply(Long x) throws Exception {
                if (x >= 2) {
                    return Observable.error(new IOException("Something went wrong!"));
                } else {
                    return Observable.just(x);
source.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
    @Override
    public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception {
        return throwableObservable.map(new Function<Throwable, Integer>() {
            @Override
            public Integer apply(Throwable throwable) throws Exception {
                return 1;
        }).scan(new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) throws Exception {
                return integer + integer2;
        }).doOnNext(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println("No. of errors: " + integer);
        }).takeWhile(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer < 3;
        }).flatMapSingle(new Function<Integer, SingleSource<?>>() {
            @Override
            public SingleSource<?> apply(Integer integer) throws Exception {
                return Single.timer(integer, TimeUnit.SECONDS);
}).blockingSubscribe(new Consumer<Long>() {
    @Override
    public void accept(Long x) throws Exception {
        System.out.println("onNext: " + x);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        throwable.printStackTrace();
}, new Action() {
    @Override
    public void run() throws Exception {
        System.out.println("onComplete");
onNext: 0
onNext: 1
No. of errors: 1
onNext: 0
onNext: 1
No. of errors: 2
onNext: 0
onNext: 1
No. of errors: 3
onComplete
                    转载请以链接形式标明出处:本文出自:103style的博客异常捕获相关的操作符 以及 官方介绍RxJava&nbsp;之&nbsp;异常捕获操作符&nbsp;官方介绍 :Error Handling OperatorsdoOnErroronErrorCompleteonErrorResumeNextonErrorReturnonErrorReturnItemonExcept...
				
代码如下:[removed] try{ …some code… }catch(e){ …some code… //处理错误 throw(e.name); //抛出异常 }finally{<BR>    // 完成后执行的语句块,非必须<BR>} [removed] javascript Error 对象: name: 错误名称number: 错误号description: 描述信息 message: 错误信息 fileName: 错误发生的文件 stack: 错误发生时的调用堆栈
转发https://www.jianshu.com/p/d9da64774f7b 项目里使用flatmap,报错:NetworkOnMainThread 这是由于ApiRetrofit.getInstance().getUserInfoById(friendId) 是运行在主线程中。 改成:return ApiRetrofit.getInstance().getUserInfoById(frien...
RxJavaPlugins.setErrorHandler(throwable -> { DLog.e(TAG,"throwable="+throwable.getMessage()); Rxjava捕获异常都会在这里显示 1.java.io.InterruptedIOExceptio... RxJava链式调用异步请求map变换操作符给大家实现android MVP结构的组织带来了极大的便利。 优美的代码,让复杂的业务逻辑清晰明了,同时也方便了代码的跟踪、问题的定位。 当我们在业务实现中出现业务异常的时候,app并没有崩溃,但是我们的后续业务执行却没有体现在界面上。 这个时候非常难定位问题的根源在哪里,因为我们的lo... catch Catch类似于java中的try/catch,当错误发生的时候,可以拦截对onError的调用,让Observable不会因为错误的产生而终止。在Rxjava中,将这个操作符实现为3个操作符,分别是: onErrorReturn 当发生错误的时候,让Observable发射一个预先定义好的数据并正常地终止
Java中的异常处理机制是通过try-catch语句来实现的。try块中包含可能会抛出异常的代码,catch块则用来捕获并处理这些异常。 当try块中的代码抛出异常时,程序会跳转到与之匹配的catch块中。catch块中的代码会处理异常,并根据需要进行恢复或报告错误。 在Java中,异常分为两种类型:受检异常和非受检异常。受检异常必须在方法签名中声明,而非受检异常则不需要。 在使用try-catch语句时,需要注意以下几点: 1. catch块中的代码必须能够处理try块中可能抛出的异常。 2. catch块中的代码应该尽可能地简洁,以避免引入新的错误。 3. 可以使用多个catch块来处理不同类型的异常。 4. 可以使用finally块来执行一些必须的清理工作,无论是否发生异常。 总之,try-catch语句是Java异常处理的核心机制之一,它可以帮助我们更好地处理程序中可能出现的异常情况,提高程序的健壮性和可靠性。