当前位置: 首页 > news >正文

比较公司网站与营销网站的不同企业起名字

比较公司网站与营销网站的不同,企业起名字,长沙做网站 必看 磐石网络,怎么用网站源码建站1 缘起 最近在学习WebFlux, 处理异常时遇到些问题,比如,Java直接抛出的异常无法直接被onErrorReturn和onErrorResume捕获, 但是,在map或者flatMap等方法之后的异常又可以直接被捕获, 于是,进行…

1 缘起

最近在学习WebFlux,
处理异常时遇到些问题,比如,Java直接抛出的异常无法直接被onErrorReturn和onErrorResume捕获,
但是,在map或者flatMap等方法之后的异常又可以直接被捕获,
于是,进行了测试,发现,onErrorReturn和onErrorResume可以捕获的异常是Throwable类型或者Mono或Flux包装的类型。
当我们在使用WebFlux中的onErrorReturn和onErrorResume捕获异常时,有两种方式:
(1)当原生Java运行时异常抛出时,需要使用Mono或Flux包装:Mono.error或FluxError;
(2)在map或者flatMap等其他原生方法中抛出的异常可以直接被捕获,无需包装。
特分享如下,帮助读者轻松应对知识交流与考核。
在这里插入图片描述

2 异常处理

异常处理是软件开发中非常重要的一环,
在业务系统中,我们需要捕获异常,给出合适的描述信息,让调用者清晰这是哪一个环节的异常。
在计算相关的业务中,通常对计算结果有更多的要求,比如,程序内部出现异常后,不能影响计算结果的输出,需要有一个保底的计算结果,比如在广告推荐系统中的广告出价,即使程序内部出现异常,仍要返回最终的广告出价,保证流程可以正常继续往下走。
当然,不同的业务系统有不同的需求,有的需要直接将异常暴露出去,有的需要记录但是给出保底的结果,但是,都要都要对异常进行处理。

2.1 WebFlux异常处理

WebFlux中的异常处理与SpringMVC中的异常处理存在不同的地方,
相同:都可使用全局异常拦截;
不同:WebFlux可以使用自定义的异常处理方法,如onErrorReturn和onErrorResume。
在WebFlux中,onErrorReturn和onErrorResume可以处理的异常是经过Mono或Flux包装的。
可以这样理解:Java直接抛出的运行时异常,onErrorReturn和onErrorResume无法直接捕获,需要通过Mono.error或者Flux.error包装,才能被正常捕获,当然,如果启用了全局异常捕获,则无需包装。
下面看一下onErrorReturn和onErrorResume的源码:

onErrorReturn

在这里插入图片描述

onErrorReusme

在这里插入图片描述

由源码可知,onErrorReturn中调用了onErrorResume,不同的是入参和返回值,onErrorReturn入参是固定值,onErrorResume入参是函数,可以自定义处理逻辑。onErrorResume的参数为Functions<? super Throwable, ? extends Mono>,由这个泛型参数可知,onErrorResume只能处理Throwable类型和Mono及其子类的类型数据,所以,无法直接捕获Java原生运行时异常。Java可抛出异常是Error和Exception的父类,因此,任何运行时异常都不能被onErrorResume或者onErrorReturn捕获,除非使用Mono.error或者Flux.error包装起来,才能正常捕获。
Java异常关系:https://blog.csdn.net/Xin_101/article/details/110210485

2.2 样例

前提条件:未开启全局异常捕获

  • 接口
@GetMapping("/mathematics/operation/flow/mono")@ApiOperation("连续流测试mono")public Mono<Response<Integer>> mathematicsOperationFlowUnderMono(@RequestParam Integer var1, @RequestParam Integer var2) {return mathematicsOperationService.divideMono(var1, var2).onErrorReturn(10).map(addResult -> {logger.info(">>>>>>Add result:{}", addResult);return Response.success(addResult);}).onErrorResume(ex -> {logger.info(">>>>>>Error resume:", ex);return Mono.just(Response.fail(-100));});}

2.2.1 原生运行时异常

Java原生异常即Throwable子类的错误和异常:Error和Exception。
以运行时异常为例,当程序出现异常时,接口返回的结果是WebFlux的信息,而不是开发者自定义的响应模板。

  • 异常处理
    @Overridepublic Mono<Integer> divideMono(Integer var1, Integer var2) {try{return Mono.just(var1 / var2);} catch(Exception ex) {throw new RuntimeException("自定义运行时异常");}}

返回的信息如下:
在这里插入图片描述

2.2.2 Mono包装异常

onErrorReturn和onErrorResume可以处理Mono或Flux包装的异常,
包装如下:

  • 异常处理
    @Overridepublic Mono<Integer> divideMono(Integer var1, Integer var2) {try{return Mono.just(var1 / var2);} catch(Exception ex) {return Mono.error(ex);}}

包装后的异常可以被哦那Error Return捕获,接口中在onErrorReturn中使用了固定数值:10,因此返回的结果是10,结果如下:
在这里插入图片描述

2.2.3 原生Mono异常

由上面可知,WebFlux可以捕获处理Mono或Flux包装的异常信息,
因此,当我们使用map或者flatMap处理数据时,可以直接使用onErrorReturn和onErrorResume捕获异常,map和flatMap中产生的异常会被直接捕获,无需进行包装。
为了测试,我们在map中添加了1/0,运行时会抛出异常,然后在onErrorResume中捕获异常,并返回-100。

    @GetMapping("/mathematics/operation/flow/mono")@ApiOperation("连续流测试mono")public Mono<Response<Integer>> mathematicsOperationFlowUnderMono(@RequestParam Integer var1, @RequestParam Integer var2) {return mathematicsOperationService.divideMono(var1, var2).onErrorReturn(10).onErrorResume(ex -> {logger.info(">>>>>>Error resume -1:", ex);return Mono.just(-1);}).map(addResult -> {logger.info(">>>>>>Add result:{}", addResult);int a = 1/0;return Response.success(addResult);}).onErrorResume(ex -> {logger.info(">>>>>>Error resume:", ex);return Mono.just(Response.fail(-100));});}

当出现异常时,onErrorResume会直接捕获,并返回自定义的数据,如上面的-100,
结果如下图所示。

在这里插入图片描述

3 小结

(1)WebFlux处理异常可以使用onErrorReturn和onErrorResume;
(2)onErrorReturn和onErrorResume可以处理的异常是Throwable类型以及Mono或者Flux及其子类包装的异常;
(3)使用Mono.error和Flux.error包装异常或者在map,flatMap之后处理异常。

http://www.yayakq.cn/news/556345/

相关文章:

  • 做网站需要啥出入合肥最新通知今天
  • 威海北京网站建设门户网站建设步骤
  • 网站设网页设计自己做国外网站买衣服
  • 做笑话网站需要什么东莞网站优化的具体方案
  • 创建建站最近国内重大新闻
  • 扬州网站商城建设价格表网站如何添加外链
  • 网站开发建设合同企业管理系统哪个好
  • 建公司网站需要多少钱wordpress 百度搜索图片
  • 雄县哪做网站不同网站的主机和域名
  • 河北省住房与建设厅网站青岛做网站的
  • 能源企业 网站建设做头像的网站横杆带字
  • 建网站多少买房子上哪个网站最好
  • 白酒网站建设广州建站服务商
  • wordpress福利网站源码网页制作与网站建设策划书案例
  • 做设计有哪些好用的素材网站有哪些乌兰县网站建设公司
  • 正规企业查询seo外链代发
  • 番禺区建设局网站高端网站建设搭建
  • 网站设计与平面设计区别网站适配移动端和PC端
  • 怎么在word里做网站网站关键词突然搜不到了
  • 巧家县住房和城乡建设局网站温州网站建设模板下载免费
  • 工作总结加强部门网站建设浙江东南网架公司
  • 做网站要备案地产网站怎么做
  • 桂林象鼻山景区简介廊坊百度提升优化
  • 井祥交通建设工程有限公司 网站市建设与管理局网站
  • ios网站开发视频教程网页版微信和电脑版微信的区别
  • 设计素材网站源码wordpress上传到又拍云
  • 杭州网站制作同德县公司网站建设
  • 如何更改网站内链药业集团网站策划方案范文
  • 韩国设计网站推荐景区门户网站建设
  • 网站开发查询企业网站托管服务常用指南