一、Java异常机制
1.Java异常处理流程![](https://i-blog.csdnimg.cn/blog_migrate/6bdbf44f6d7b6ce643ce8a482ce87ddc.png)
2.Java异常处理机制
3.Java异常体系
二、异常处理设计与实践
1.异常抛出与捕获的原则
非必要不使用异常
使用描述性消息抛出异常
力所能及的异常一定要处理
异常忽略要有理有据
2. 特殊NPE场景及其处理对策
①级联调用时容易产生NPM(NullPointException)
String name=university.getColleage().getClass().getName();
如上述代码获取时没有进行判空操作直接调用后续方法,就很容易发生NPM。
对应操作1:
if(university!=null){
Colleage colleage=university.getColleage();
if(colleage!=null){
Class class=colleage.getClass();
if(class!=null){
String name=class.getName();
}
}
}
可以看出上述代码拆开写的话十分长,及其不优雅。
对应操作2:
String name=Optional.ofNullable(university)
.map(uni-> uni.getColleage())
.map(coll->coll.getClass())
.map(cla ->cla.getName())
.orElse("");
如此使用则可忽略判空操作,orElse则在中间出现Null值的情况下为name赋予的初始值。
3.特殊异常场景处理及其处理对策
foreach遍历集合的异常。
不要在foreach循环过程中操作循环对象的add/remove方法,foreach会判断初始对象数量和操作对象数量,如果不一样会报错。
三、日志规约
1.日志的功能
①监控告警:
健康检查
指标监控(告警)
②记录行为轨迹
指标监控(查询)
链路追踪
③快速定位问题
日志
2.日志时效规约
当天日志命名:以“应用名.log” 来保存
过往日志命名:以{logname}.log.{保存日期}命名: 日期格式:yyyy-MM-dd
日志文件至少保存15天:便于排查某些以“周” 为频次发生的异常
敏感信息操作联机储存6个月:网络安全相关 法律的规定
3.日志记录规约
系统应依赖使用日志框架(slf4j,JCL)的api而不是具体日志库中的
在日志输出时,字符串变量之间的拼接使用占位符的方式
日志打印时禁止直接使用JSON工具将对象转换成String
尽量使用英文来描述日志错误信息
4.日志输出规约
日志级别开关判断:对于 trace/debug/info级别的日志输出,必须进行日志级别的开关判断
异常日志信息要完整:
异常日志信息应该包括以下两类信息:
案发现场信息
异常堆栈信息
避免重复打印日志:重复打印日志,浪费磁盘空间,务必在日志配 置文件中设置 additivity=false
5.扩展日志的设计与规约
扩展日志单独存储: 应用中的扩展日志(如打点、临时监控、访问日志等)单独存储
错误日志单独存储:业务日志与错误日志分开存储