《Java开发手册(泰山版)》之异常日志
1、异常处理2、日志规约
1、异常处理
(
1)NullPointerException,IndexOutOfBoundsException 等不应该通过
catch 的方式来处理
正例:
if (obj
!= null
) {...}
(
2)异常不要用来做流程控制,条件控制
(
3)捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。
最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容
(
4)事务场景中,抛出异常被
catch 后,如果需要回滚,一定要注意手动回滚事务
(
5)
finally 块必须对资源对象、流对象进行关闭,有异常也要做
try-catch
(
6)不要在
finally 块中使用
return
private int x
= 0;
public int checkReturn() {
try {
return ++x
;
} finally {
return ++x
;
} }
(
7)防止 NPE,是程序员的基本修养
---使用 JDK8 的 Optional 类来防止 NPE 问题
1) 返回类型为基本数据类型,
return 包装数据类型的对象时,自动拆箱有可能产生 NPE
反例:
public int f() { return Integer 对象
}, 如果为 null,自动解箱抛 NPE
2) 数据库的查询结果可能为 null
3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null
4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE
5) 对于 Session 中获取的数据,建议进行 NPE 检查,避免空指针
6) 级联调用 obj
.getA().getB().getC();一连串调用,易产生 NPE
2、日志规约
(
1)应用中不可直接使用日志系统(Log4j、Logback)中的 API
而应依赖使用日志框架(SLF4J、JCL
--Jakarta Commons Logging)中的 API
使用 SLF4J:
import org
.slf4j
.Logger
;
import org
.slf4j
.LoggerFactory
;
private static final Logger logger
= LoggerFactory
.getLogger(Test
.class);
(
2)以 mppserver 应用为例,日志保存在
/home
/admin
/mppserver
/logs
/mppserver
.log,历史日志
名称为 mppserver
.log
.2016-08-01
(
3)在日志输出时,字符串变量之间的拼接使用占位符的方式
logger
.debug("Processing trade with id: {} and symbol: {}", id
, symbol
)
(4) 对于 trace
/debug
/info 级别的日志输出,必须进行日志级别的开关判断
if (logger
.isDebugEnabled()) {
logger
.debug("Current ID is: {} and name is: {}", id
, getName());
}
(
5)异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字
throws 往上抛出
logger
.error(各类参数或者对象
toString() + "_" + e
.getMessage(), e
);