什么情况下需要抛出异常,什么情况下需要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 北京

相关推荐

03-23 21:55
门头沟学院 Java
1.首先要知道,学校节奏慢,内容落后,在学校学不到东西的。而且等你老老实实从学校学完,你面对的是有两三段大厂实习的选手,而你默默在简历上写着三年班委经验,高等数学90多分.....你怎么和别人竞争?所以一定要润出去实习。2.有课程/查寝跑不出去,首先是实习的话不要弄得人尽皆知,范围控制在只有你室友知道(如果室友相处不行,室友也不要告诉),并且和你室友说不要外传。然后找人代课,加一些学校的二手群,发信息找人长期代课,如果是一些老师不点名啥的课,甚至不需要找人代课。如果有签到啥的,那就八仙过海,总会有办法的。不要继续保持传统的学生的迁腐的思维,整天想着上课咋办,课算个屁,自己的前途才是最重要的。3.果被发现了,导员要求回去。可以直接和父母沟通,告诉他们学校没用,我要出去实习,说服父母观念,然后让父母和导员去对线,就说父母都答应孩子出去,学校别管这事了,可以签安全协读什么的,但这些都要偷偷进行,不要扩大影响,相当于跟学校私底下互相给个台阶。4.如果还是不行,可以暗度陈仓,和公司请假回去老实几天,再出去实习。#牛客AI配图神器#5.反正就是八仙过海,不要给自己找各种理由,总会有办法的。最大的障碍也许不是学校,是你的勇气,你的传统思想。
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务