异常处理规范
try-catch代码块竟可能小范围
保证try-catch的代码块尽可能小,以保证catch不会捕获你为意识到的异常,特别是可能抛出的空指针。
1 | // badcase |
尽可能捕获明确的异常
配合第1点,代码块尽量小时,可以捕获更加明确的异常。
时刻提醒自己可能出现其他异常。
使用断言
此断言非java的 assert 关键字, 可以使用Spring 的Assert类
所有public的接口调用, RPC远程调用。都是不可靠的。
为了减少空指针异常带来的不确定性(NPE),请善用断言(Assert),fail-fast 逻辑。
仅在按照约定,某个事件必不可能发送,一旦发生,你的业务逻辑也并无其他处理方案时(没有fallback)使用断言。
使用断言配合message,可以快速的在日志,报警或者其他可视化系统中,发现并定位问题,也能给前端正确的异常提示,减少用户焦虑,加快排查问题的速度。
1 | // better case |
不厌其烦的判空
- 会触发自动拆箱时。 如:
1 | int a = someInteger |
- 嵌套对象取值时:
1 | Long id = userInfoDTO.getUserInfo().getUserId(); |
从redis,数据库或其他DB获取值时。
调用其他人书写的方法时。
⚠️调用自己,或第三方jar包提供的工具类时, 特别是:
parse
get
transform
- 参数校验写明message
1 | // badcase |
- 使用工具类判空
优先使用
- Objects.equals(a, b)
- StringUtils.isBlank(a);
- StringUtils.isNotBlank(a);
- CollectionUtils.isEmpty(a);
等工具类判断对象或者数据结构。
- GlobalException的使用
⚠️使用更精准的异常信息。
不要单纯的使用 ResponseCodeEnum.FAIL,(即9999报错)
对于特定的报错,请使用定义好的ResponseCode, 且他的message必须清晰。
如果觉得务必要新建ResponseCode, 也应该使用 GlobalException(ResponseCodeEnum code, String message); 构造方法, 把详细的报错信息放入Exception中。
不要单纯的使用 ResponseCodeEnum.FAIL,(即9999报错)
对于特定的报错,请使用定义好的ResponseCode, 且他的message必须清晰。
如果觉得务必要新建ResponseCode, 也应该使用 GlobalException(ResponseCodeEnum code, String message); 构造方法, 把详细的报错信息放入Exception中。