第五天 异常处理与日志
在销售业务中,有一个很重要的模块是售后模块,负责客户的不良品处理,纠纷处理,产品维修等等。同样的,在电商代码中,也有一个重要的模块就是异常的处理和日志模块,负责代码的异常信息反馈和预防,为系统的稳定运行保驾护航。
JAVA异常的处理流程
当程序发生异常时,jvm会实例化异常对象信息,然后判断该异常是否被try包裹,如果未包裹,JVM直接抛出异常信息,该段代码结束执行。如果被try包裹,进入try catch流程,catch执行完之后判断是否有finally,如果有finally,进入finally流程。try catch finally执行完之后。如果finally未出现异常,将继续执行代码。
try catch finally 流程中,如果finally里定义了return,那么无论try代码中的return了什么内容,都会被finally的return覆盖,所以finally中不要return。
try with resource
在JDK7中加入了一种新的try with resource结构,用于应对io流打开关闭的场景,方便的处理了io关闭的很多麻烦。
代码示例如下:
try(FileInputStream fin = new FileInputStream(new File("filePath"));
FileOutputStream fout = new FileOutputStream(new File("filePath1"));
GZIPOutputStream out = new GZIPOutputStream(fout)
){
// 读文件
}catch(IOException e){
logger.error(e.getMessage());
e.printStackTrace();
}
NPE场景的处理对策
JDK8的 Optionnal类可以优雅的防止NPE,而不是像之前一样写了一大堆if(null != object) 。在优化代码的同时也提升了代码执行效率,循环次数越高,性能差距越大,并且成指数级上升。
特殊异常场景及其处理对策
foreach遍历集合的异常
1.不要在foreach循环里进行元素的remove/add操作,foreach实质上是Iterator
日志规约
日志的功能:发生异常的时候快速定位问题发生点。
日志时效:当天日志以应用名.log命名。过往日志命名格式:应用名.log.yyyy-MM-dd,日志文件至少保存15天,用以排查某些周期为周甚至更长时间发生的异常。由于网络安全相关规定,敏感操作信息联机存储6个月以上,同时还可以用来作为解决纠纷的依据。
日志记录规约:1.使用slf4j,JCL框架的API。2.在日志输出时,字符串变量之间的拼接使用占位符的方式。3.日志打印时禁止直接使用JSON工具将对象转换成String 。4.尽量用英文来描述日志错误信息。
日志输出规约
1.日志级别开关判断。对于trace/debug/info级别的日志输出,必须进行日志级别的开关判断。
2.异常日志信息要完整。异常日志信息应该包括异常案发现场信息,异常堆栈信息。
3.避免重复打印日志。重复打印日志,浪费磁盘空间,务必在日志配置文件中设置additivity=false。
错误码规约
1.定义时要有字母也要有数字
2.要分级分类管理
3.不能直接输出给用户作为提示信息使用
4.不要与业务框架或者组织架构挂钩
5.使用者避免随意定义新的错误码
6.便于不同语言的开发者之间协作