实战篇-设计类实战

# Java接口Result设计

方法签名
User getUserById(Long userId) throws BizException;

- 返回值User:方法的输出,方法的功能执行结果的准确表达,不应该有超出这个语义的东西存在。
- 异常BizException: 方法意外出现的错误,指超出这个方法之外的部分。

## 什么是意外-系统异常
意外指我们无法预知的,非正常情况,比如网络超时,DB异常,Bug等,调用方一般不太可能基于这些错误做不同的业务逻辑处理,调用不能通过调整参数继续处理。常用于日志和监控,方便定位排查。
结论:系统异常,通过异常返回

## 什么是失败-业务失败
失败指业务规则拦截导致的失败,比如密码错误,权限不足,余额不足。调用方可以根据不同的失败状态,完成不同的业务逻辑。
结论:业务失败,通过返回值返回

## 判断标准是什么
如果一个错误,调用方只能通过人工介入的方式才能恢复,比如修改代码,该配置,则必然属于异常;
如果调用方无法使用代码逻辑来处理错误而自动恢复,而是只能通过重试的方式,依赖下游的恢复才能恢复,则属于异常

## 接口返回设计建议
1. 对响应合理分类

普通读接口,建议直接用领域对象作为返回值,有特殊业务规则的除外
普通写接口,建议使用Result作为返回值,避免直接包装原生类型,避免所有的错误定义在一个类中

2. 对异常的处理
> 处理位置:
原始位置catch,记录日志,记录出入参,转化为本应用异常,上抛;
应用顶层catch,打印统一日志,打印堆栈,返回统一结果
中间层,不catch

> 处理方式:
系统异常直接抛出异常
参数错误,一般可以使用assert来保证正确。即我们的后续逻辑认为,当前的参数是不可能错误的,我么没必要为此写过多繁琐的防御性代码
系统异常并非一定是异常,我们可以转化成一个业务结果,比如网络异常无法获取结果,我们需要转化为未知状态,通过查询结果获取最终结果


The Complete Works of Tao Technology 2021

你可能感兴趣的:(实战篇-设计类实战)