响应式编程里对于异常的处理的内容还是比较简单的。如果想要详细了解异常的处理都有哪些的话,可以直接看api中带有error的方法即可。本节会举例几个重点的来介绍一下。
doOn/on
doOn系列,其实doOn是一系列方法,在数据产生指定情况的时候会有类似通知一样的回调。之前提到的doOnComplete就是其中之一,其实所有事件的产生都会有一个对应的doOn方法(doOnCancel、doOnComplete、doOnDiscard、doOnEach、doOnError、doOnNext、doOnRequest、doOnTerminate、doOnSubscribe)。
其中对于Error的处理,实际上是有重载的几个方法,其中主要的功能就是当出现异常后我们要做什么事情,另外重载方法里面还可以传入一个class参数来指定只针对指定的异常类来进行对应的处理,第三个重载方法通过Predicate支持我们针对指定的一些符合条件的异常进行处理。
简单看下调用示例:
1 2 3 4 5 6 |
Flux.just(1,2) .map(i -> i/0) .doOnError(System.out::println) .retry(3) .onErrorReturn(0) .subscribe(System.out::println); |
我们生成一组数,然后对数据内容进行除以0,会产生一个ArithmeticException异常,这里调用doOnError来打印异常信息。后面调用了一个retry方法,这个retry大家要注意千万别理解错了,他是从整个序列的最开始元素进行retry(假设我们只有偶数才除以0,那么就会打印4次1),所以咱们这个map的写法不管怎么retry都是异常,重试三次,所以总共会产生4次报错打印。
接着我们调用了onErrorReturn方法,在异常时返回0,所以最后还会再通过subscribe(System.out::println)来打印了一个0。这里要注意的是,retry要跟着doOnError,如果吧retry和onErrorReturn换了顺序的话,就没有办法retry了,都没问题返回0了。另外,onErrorReturn和doOnError类似,也是支持同样参数的3个重载方法的。
除了上面写到的onErrorReturn,其实还有支持更复杂逻辑的onErrorResume方法,其接收一个Function,我们可以重写其方法针对得到的异常进行逻辑处理并返回对应的内容,比如判断异常类型返回不通结果等。其实onErrorReturn也是调用的onErrorResume来实现的。
在subscribe的重载方法中其实也是可以处理异常的,这块在上一节的其中一个示例代码里也可以看到,没什么区别就不做赘述了。
其实还有其他error相关的方法,onErrorMap、onErrorContinue,这里就不再赘述了,大家可以看下源码。
Exceptions
Exceptions中提供了一些工具方法,这里介绍一个比较常用的例如propagate,把一些不确定的异常包装为已知的异常,比如RuntimeException、ReactiveException等。
示例代码如下:
1 2 3 4 5 6 7 8 9 10 |
Mono.just(new User("halo")) .map(u -> { try { u = getDetails(u); } catch (Throwable e) { throw Exceptions.propagate(e); } return u; }) .subscribe(System.out::println); |
©原创文章,转载请注明来源: 赵伊凡's Blog
©本文链接地址: 响应式编程的Error