异常定义
- fault(缺陷)
设计缺陷:代码错误
组件缺陷:组件无法提供功能,包括物理缺陷和交互缺陷
http 200,return code 0,返回具体错误原因
- error(错误)
http 520,接口内部错误
- failure(失败)
http 520,return code 非0,无法提供正常功能
- exception(异常)
程序语言中传递缺陷、错误、失败的对象
函数不返回null
- 返回””、List、null object 代替
缺陷处理
- 避免缺陷(提前校验)
- 缺陷容忍(使用备用方案)
- 缺陷移除(修复错误状态)
- 缺陷预测(检测软件质量)
使用try-witch-resource自动清理资源
finally抛出的异常会覆盖try和catch抛出的异常
try、catch、finally处理范围
- try
资源初始化、逻辑处理、抛出异常
- catch
异常处理、抛出异常、流程重试
- finally
释放资源
已查异常和未查异常
- 已查异常
可恢复的异常
- 未查异常
程序错误、开发者应该编程处理
接口升级
- 区分公开接口与发布接口
- 重构非发布接口
- 谨慎声明发布接口
- 不要改变发布接口
异常处理等级
- 等级0:未定义
http 200,return code 0,接口功能是否正常不确定
- 等级1:错误报告
http 200/520,接口失败时,返回具体错误码
1 | 1、不忽略已查异常 |
- 等级2:状态恢复
错误处理、资源释放
1 | 1、向后恢复,撤销操作、恢复原数据 |
- 等级3:行为恢复
在异常时,执行备用逻辑
1 | 1、缺陷处理,诊断、隔离、重新配置、重新初始化 |
异常设计
- 异常名称使用异常内容表达,比如not found exception
- 低级异常转抛成高级异常
- 同构异常,接口抛出父异常,使接口定义同一
- 已查异常不处理时,转抛出未查异常
- 通道异常、异常包装,回调函数使用未查异常TunnelingException封装已查异常
- 聪明异常,使用异常码区分同一种类的异常
异常的终止与继续
- 终止
结束逻辑,抛出当前层次异常
- 继续
记录异常,并继续处理
1 | 1、批处理 |
异常处理的坏味道
- 返回码代替异常
- 忽略已查异常
- 捕获Throwable跳过异常,比如空指针异常等
- 程序最外层没有捕获所有异常
- 异常处理只记录日志
- try语句套嵌
- 重试代码写在catch块
- 资源释放没有写在finally块
1 | 1、用异常代替错误码 |