一、JAVA异常体系
Throwable包含Error与Exception
而Exception下面又包含RuntimeException(uncheckedException,即不受检查异常)和checkedException受检查异常
二、异常处理
非必要不使用异常
使用描述性消息抛出异常
力所能及的异常一定要处理
异常忽略要有理有据
栗子:
使用Optional优雅地防止NPE
1)实例化Optional
Optional.ofNullable(obj)
2)使用orElse()方法解决NPE问题
orElse()的作用是设置默认值,当发生NPE时,返回指定的默认值
3)使用ifPresent()方法解决NPE问题
ifPresent(Consumer<? super T> consumer)就是在value值不为空时,做一些操作
4)对象非空判断性能高
当总循环次数<10000时,使用Optional与普通嵌套null非空检测查询稳定在30ms;
当总循环次数>10000&<10000000时,Optional比普通嵌套null非空检测查询性能高出10-20倍;
当总循环次数>10000000时,性能差距呈指数上升
三、日志规约与错误码规约
日志记录规约:
- 系统应依赖使用日志框架(SLF4J、JCL)的API而不是具体日志库中的
- 在日志输出时,字符串变量之间的拼接使用占位符的方式
- 日志打印时禁止直接用JSON工具将对象转换成String
- 尽量用英文来描述日志错误信息
日志输出规约:
- 日志级别开关判断(trace/debug/info级别输出,必须进行日志级别的开关判断)
- 异常日志信息要完整(案发现场信息/异常堆栈信息)
- 避免重复打印日志(配置文件中设置additivity=false)
扩展日志的设计与规约:
- 扩展日志单独存储(如打点、临时监控、访问日志等)
- 错误日志单独存储(业务日志与错误日志分开存储)
错误码规约:
- 定义时要有字母也要有数字
- 要分级分类管理
- 不能直接输出给用户作为提示信息使用
- 不要与业务架构或者组织架构挂钩
- 使用者避免随意定义新的错误码
- 便于不同语言的开发者之间的协作
Ps:常见错误码A0001 A0100 A0200 A0300 A0400 B0001 B0100……