0%

读书笔记 异常处理的设计与重构

异常定义

  • 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
2
3
4
1、不忽略已查异常
2、不捕获未查异常
3、转抛异常时,不记录日志
4、最外层捕获所有异常
  • 等级2:状态恢复

错误处理、资源释放

1
2
1、向后恢复,撤销操作、恢复原数据
2、内存清理、资源释放
  • 等级3:行为恢复

在异常时,执行备用逻辑

1
2
3
1、缺陷处理,诊断、隔离、重新配置、重新初始化
2、重试
3、向前恢复,使用备用数据再次处理、使用备用逻辑继续处理

异常设计

  • 异常名称使用异常内容表达,比如not found exception
  • 低级异常转抛成高级异常
  • 同构异常,接口抛出父异常,使接口定义同一
  • 已查异常不处理时,转抛出未查异常
  • 通道异常、异常包装,回调函数使用未查异常TunnelingException封装已查异常
  • 聪明异常,使用异常码区分同一种类的异常

异常的终止与继续

  • 终止

结束逻辑,抛出当前层次异常

  • 继续

记录异常,并继续处理

1
2
1、批处理
2、定时任务

异常处理的坏味道

  • 返回码代替异常
  • 忽略已查异常
  • 捕获Throwable跳过异常,比如空指针异常等
  • 程序最外层没有捕获所有异常
  • 异常处理只记录日志
  • try语句套嵌
  • 重试代码写在catch块
  • 资源释放没有写在finally块
1
2
3
4
5
1、用异常代替错误码
2、未查异常代替忽略的已查异常
3、未查异常代替空的异常处理
4、程序最外层捕获Throwable
5、套嵌的try使用函数封装