什么情况下需要抛出异常,什么情况下需要catch住异常?

站在代码开发者的角度

在进行异常处理的时候,可以try catch住这些异常,然后在catch那里打印错误日志,方便定位问题。

还有一种在发现异常的时候,可以把这部分异常抛出来,让上游调用方可以知道这里会出现哪些异常,上游调用方在获取到这些异常时,可以根据业务特点来处理这部分异常。

站在调用方的角度

在调取其他模块接口的时候,需要知道被调用方接口有哪些异常,调用方根据业务特点来处理这部分异常。异常有2种处理方式:

1.try catch住这些异常,其他接口的异常并不影响当前接口

2.抛出异常,其他接口异常后,当前接口也异常。具体哪种处理方式需要根据自己的业务特点选择。

总体来说

如果你的服务就是请求链路的最上游或者你写了一个没有人调用的接口,你根据自己的业务特点catch住异常是没有问题的。

如果你的代码有其他人调用,那么出现异常你需要把异常抛出来。

代码讲解之前先解释一些名词,不要因为这些名词而引起对代码理解的偏差;

服务A在接收到前端请求后,需要调取接口B查询一部分数据,需要调取接口N查询一部分数据,然后进行数据拼装返回。这叫请求链路。

对于接口B,接口A就是接口B的接口调用方,接口B的上游就是接口A。

前端想要获取数据,那么接口A就是最上游。接口A没有后端调用者。接口B或者接口N,都有调用者,调用者是接口A。

业务场景:

用户在外卖商品页面选择完商品后,点击提交订单,后端服务需要保存订单数据和将商品的库存数量减1。

接下来看代码:

这个代码里面包含2部分逻辑,逻辑1是保存订单数据,逻辑2是更新商品库存数据。

问题:

负责开发更新商品库存接口的同学把异常给try{}catch{}住了。当用户点击提交订单时,请求落到了订单服务,OrderService.saveOrder()方法将订单数据保存后,调取更新商品库存数量的接口,更新商品库存数量的接口异常了,商品库存数量并没有更新成功,但是因为异常try{} catch{}住了,对于订单服务而言,订单服务又不知道商品库存接口异常了,返回给用户保存成功,但是现在商品库存数据却没有保存成功;

发现问题后,让商品库存的同学把代码修改下,把异常抛出来,不要自己把异常处理(吃)了

代码变成如下形式,当更新商品库存数据异常后,订单服务也抛出异常,让用户知道提交订单异常,用户可以选择再次下单。

业务场景:

这个是商品详情页,包含商品数据和评价数据。 如果评价数据可以查询到就展示,查询评价数据异常时,页面降级不展示评价数据。

接下来看代码:

这个代码里面包含2部分逻辑,逻辑1是查询商品数据,逻辑2是查询评价数据。因为GoodsService的getGoodsById()方法将查询评价数据接口try{}catch{}住了,查询评价数据接口异常时,并不会影响查询商品数据接口的稳定性。

总结:

如果这个方法在调用链路的下游,有其他系统去调用这个方法时,出现异常了需要将异常抛出来;上游调用方可以根据自己的业务特点选择抛出异常或者try{}catch{}住异常。

接下来看另一个场景:

业务场景:

用户下单,取消订单或者其他订单关联的业务,需要将订单状态流转数据保存到订单日志表中,当订单数据出现问题时,通过订单日志表,很方便的可以定位出问题。

接下来看代码:

创建订单和取消订单主要包含3部分逻辑:

1.保存或者更新订单数据

2.将订单操作日志数据写入到数据库中

3.如果订单操作日志数据写入数据库异常时,发送一条MQ消息,让MQ消息的重试机制保证日志数据写入成功。

问题:

OrderLogService除了OrderService调用外,不会有其他类会调用。OrderService对OrderLogService的异常处理逻辑一样,处理逻辑为发送一条MQ消息,通过MQ消息的重试机制保证日志数据写入成功。一个异常,超过2个方法处理(修改订单未实现),而且处理逻辑一样。 异常不如让OrderLogService自己来处理。

将代码改成如下形式:如果操作日志数据写入失败后,让OrderLogService内部自己处理。

这样做的好处:

1.OrderService代码简洁,不用再去处理OrderLogService异常;

2.现在日志数据写入失败后,OrderLogService会发送一条MQ消息。 以后需要修改异常处理方式,只需要修改OrderLogService里面的逻辑就好。

总结:

如果这个方法只有同一个系统的接口去调用,而且内部对这个异常有相同的处理逻辑,出现异常了可以让这个方法将异常处理掉,这样其他调用方就不需要处理异常了

#大厂##面试题目#
全部评论
受益良多 感谢 我个人体会反倒是try catch 容易出问题,想问下直接不写try catch 和 catch 后再 throw Error有啥区别嘞?
点赞 回复 分享
发布于 04-07 18:19 河南
mark业务场景分析
点赞 回复 分享
发布于 04-07 18:02 北京

相关推荐

04-10 17:42
Java
         一般情况下,国内绝大部分院校应届毕业生都会有一次三方违约的机会,以便毕业生可以签约心怡的意向单位,那么毕业生提出三方违约的流程是什么样子的?这里用10步为你详细介绍三方违约的流程,帮助你提前建立对三方违约的认知。        第一步,和原签约单位联系,表达三方违约意愿,按签约规定看是否需要赔偿违约金。一般情况下国企、银行、研究所违约金在1~2w之间,大厂一般没有违约金,部分私企违约金在5k~1w之间。        第二步,向原签约单位发送解约申请邮件,解约申请邮件模板一般原签约单位会提供,按照指定格式编写并发送邮件即可。        第三步,原签约单位收到解约申请邮件后,会向毕业生发送电子版解约函,注意:此解约函公司没有盖章,学校并不认可。        第四步,打印解约函并签字寄回原签约单位。        第五步,在规定期限内(一般是原签约单位回复解约申请邮件的7个自然日内)向原签约单位支付违约金。        第六步,原签约单位财务确认收款后,会将纸质版解约函盖章邮寄至毕业生处。        第七步,毕业生拿到纸质版解约函后将其扫描程电子版。        第八步,填写XX大学毕业生违约申请表,申请表填写完毕后打印下来,由学院领导签字盖章,之后扫描成电子版文件。        第九步,在网签系统上传电子版违约申请表、原签约单位解约函、接受单位录用通知书和违约申请理由,由毕业生所在学院审核。        第十步,学院审核通过后,交由原签约单位审核(原签约单位需要在网签系统点击违约同意按钮),通过后,学校审核,审核通过后,三方解约完毕。Tips:        1.注意毕业生所在院校违约处理时间。有些院校需要在指定月份才开始处理违约,有些院校则没有时间限制。        2.注意原签约单位处理解约时间。有些单位可随时解约,有些单位必须到第二年的三月份或四月份或五月份甚至有的七月份才处理违约申请。        3.是否可以先签订两方。若原签约单位因某些因素无法处理解约,和接受单位是否可以先签订两方,等违约成功后再签订三方。注意:有的单位不接受两方签订!        4.有的单位签订三方后不接受违约!这些单位不会出具解约函也不会在网签系统点击违约同意按钮,针对这些单位需要慎重考虑是否签约。
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务