切面对于同一处理异常有很大的便利性,经常在项目中用到。
在系统开发中,切面应用于两层,一个是对外提供的Facade的层,一个是访问外部的rpc层,对这两层的处理都有都有异常捕获流程。
facade由于是对外提供的接口,一般该接口会返回code值以及结果对象,调用方会根据code值判断接口执行的结果,以及异常情况,不应该通过异常捕获判断接口是否正常。所以,这一层的切面异常捕获,应该是一种兜底方案,即facade层无法捕获的异常,避免调用方捕获到异常。
rpc层是调用外部接口的一层,这一层的切面也是捕获非预期结果的异常,而不是有问题就像上抛异常。
比如,查询订单列表的功能,关注结果是不是要达到预期。预期的结果是,这个接口的返回结果应该是一个订单列表,列表两种结果:空或有数据,这种都属于正常的结果,直接向上返就行了。
使用rpc调用时,异常情况有两种,一种是网络连接超时、无服务等,遇到这种异常,直接抛出,因为这种属于非预期错误,导致业务中断。另外一种情况是,rpc返回的结果有success字段标识结果是否正常,true表示调用正常,data数据无论是否为空,都向上返回结果即可;而success=false时,接口含义是无业务逻辑,标识底层错误,那么也应该抛出异常,用来表示出现了导致业务中断的异常。
还有一种接口,比如提单rpc接口,这种接口success=false时,是表示提单失败,这种是有业务含义的,所以不能简单的抛异常,而是将该结果向上向上返回。
一些题外话:
对于分布式服务框架的调用,很多人rpc层的返回值直接使用接口的返回值。这种做法是欠妥的,比如订单接口,原来订单的金额用price表示,后来接口提供方进行接口重构时,将金额改成了totalPrice,这种情况,如果上层使用了该字段,则受到影响。所以建议的方式是,将rpc调用返回的结果转换成自己业务中使用对象,使得rpc层也起到一个防腐层的作用。
rpc层中的对象可以以PO结尾。
以上,欢迎指正。