RxJava中的错误处理
来源:互联网 发布:js原生与jquery 编辑:程序博客网 时间:2024/05/08 09:37
在RxJava中我们可以很方便地处理异常,只要加上onError
即可。
不过,如果异常发生在操作符内部,比如flatMap,那我们怎么把这个异常传递给onError
呢。
Checked异常和Unchecked异常
* Checked异常必须被显式地捕获或者传递,而unchecked异常则可以不必捕获或抛出。
* Checked异常继承java.lang.Exception类。Unchecked异常继承自java.lang.RuntimeException类。
Unchecked异常
一般情况下,unchecked异常会自动传递给onError
。例如以下代码可以打印出“Error!”。
Observable.just("Hello!") .map(input -> {throw new RuntimeException();}) .subscribe( System.out::println, error -> System.out.println("Error!") );
也有例外的情况,那就是… 那些非常严重的错误,以致于RxJava不能都继续运行了。比如StackOverflowError
,这些异常被认为是致命的,对它们来说,调用onError
毫无意义,并没什么用。你可以用Exceptions.throwIfFatal
来过滤掉这些致命的异常并重新抛出,不发射关于它们的通知。
Checked异常
尽管RxJava有自己的异常处理机制,不过Checked异常还是必须由你的代码来处理,也就是说,还是要自己加try-catch
。
假设我们用到这样方法:
String transform(String input) throws IOException;
我们可以把Checked异常转换为Unchecked异常,像这样:
Observable.just("Hello!") .map(input -> { try { return transform(input); } catch (Throwable t) { throw Exceptions.propagate(t); } });
Exceptions.propagate()
只是简单地做了这样一件事:如果异常是Checked异常,那就把它包装成Unchecked异常。
而对于像flatMap
这样返回Observable对象的操作,可以直接返回Observable.error()
。
Observable.just("Hello!") .flatMap(input -> { try { return Observable.just(transform(input)); } catch (Throwable t) { return Observable.error(t); } });
屏蔽异常
很多RxJava初学者都犯了一个错误,过度地使用onError
,其实onError
应该在数据无法继续处理下去时才使用。例如,在使用Retrofit 1的时候,响应的状态码为非200的结果调用onError
,这样,我们在处理非200的响应结果时就会变得十分麻烦。这个问题在Retrofit 2已经解决了,现在可以通过Observable
Observable.just("Request data...") .map(this::dangerousOperation) .onErrorReturn(error -> "Empty result");
当dangerousOperation产生异常时,不会触发onError
,而是返回字符串”Empty result”。
当上游的Observable
观察到异常通知(onError
)时,通过onErrorReturn
或onErrorResumeNext
来把onError
转换成与下游序列有所区分的数据。
参考
Error handling in RxJava
RxDocs
- RxJava中的错误处理
- RxJava错误处理
- RxJava之错误处理
- RxJava 错误处理
- RxJava错误处理
- RxJava 错误处理
- RxJava----操作符:错误处理
- RxJava操作符(06-错误处理)
- RxJava 驯服数据流之高级错误处理
- RxJava 驯服数据流之高级错误处理
- RxJava 驯服数据流之高级错误处理
- OkHttp Retrofit RxJava 统一错误处理
- Retrofit+RxJava 优雅的处理服务器返回异常、错误
- RxJava 学习笔记(九) --- Error Handling 错误处理操作
- Retrofit+RxJava 优雅的处理服务器返回异常、错误
- RxJava 错误处理操作符(Error Handling Operators)
- RxJava 错误处理操作符(Error Handling Operators)
- 比较实用的rxJava自动处理服务器错误码
- ajax jsonp 跨域
- 如何快速将idea快捷键转化成Eclipse风格
- bzoj 3343: 教主的魔法
- Spring框架中IOC和aop
- 《机器学习实战》——k-近邻算法Python实现问题记录
- RxJava中的错误处理
- python3中的mysql数据库操作
- 对委托的初步研究
- mysql update语句的用法详解
- leetcode_033 Search in Rotated Sorted Array
- 蓝桥杯_算法提高_金明的预算方案(动态规划、01背包变形)
- 对手势分发机制的一些理解
- 火车调度问题
- 【bzoj2795】[Poi2012]A Horrible Poem hash