不管是在响应式编程还是普通的程序设计中,异常处理都是一个非常重要的方面。
对于Flux
或者Mono
来说,所有的异常都是一个终止的操作,即使你使用了异常处理,原生成序列也不会继续。
但是如果你对异常进行了处理,那么它会将oneError
信号转换成为新的序列的开始,并将替换掉之前上游产生的序列。
先看一个Flux
产生异常的例子
1 |
|
会得到一个异常ErrorCallbackNotImplemented
:
1 | 100 / 10 = 1 |
1. onError方法
Reactor
中subscribe
的onError
方法(subscribe第二个参数),就是try catch
的一个具体应用:
1 |
|
运行结果:
1 | 100 / 10 = 1 |
2. onErrorReturn方法
onErrorReturn
可以在遇到异常的时候fallback
到一个静态的默认值:
1 |
|
运行结果:
1 | 100 / 10 = 1 |
onErrorReturn
还支持一个Predicate
参数,用来判断要falback
的异常是否满足条件。
1 | public final Flux<T> onErrorReturn(Predicate<? super Throwable> predicate, T fallbackValue) |
3. onErrorResume方法
onErrorResume
可以在捕获异常之后调用其他的方法。
1 |
|
运行结果:
1 | 100 / 10 = 1 |
4. retry方法
retry
的作用就是当遇到异常的时候,重启一个新的序列
1 |
|
运行结果:
1 | [4,100 / 10 = 1] |
elapsed
是用来展示产生的value时间之间的duration。从结果我们可以看到,retry
之前是不会产生异常信息的。
5. doOnError方法
doOnError
只记录异常信息,不破坏原来的React
结构。
1 |
|
运行结果:
1 | 100 / 10 = 1 |
doOn
系列方法是publisher
的同步钩子方法,在subscriber
触发一系列事件的时候触发
6. doFinally方法
doFinally
可以像传统的同步代码那样使用finally
去做一些事情,比如关闭http
连接,清理资源等。
1 |
|
运行结果:
1 | 100 / 10 = 1 |
第二种收尾操作的方法是using
,我们先看一个using
的定义:
1 | public static <T, D> Flux<T> using(Callable<? extends D> resourceSupplier, Function<? super D, ? extends |
可以看到using
支持三个参数,resourceSupplier
是一个生成器,用来在subscribe
的时候生成要发送的resource
对象。sourceSupplier
是一个生成Publisher
的工厂,接收resourceSupplier
传过来的resource
,然后生成Publisher
对象。resourceCleanup
用来对resource
进行收尾操作。
1 |
|