混合使用JAVA异常处理机制和返回值使程序的异常处理部分变得“丑陋不堪”,并难以理解。如果有多种不同的异常情况,就定义多种不同的异常,而不要像上面代码那样综合使用Exception和返回值。
三、日志优化及注意事项
3.1、Log上下文
在Log中必须尽量带入上下文的信息,对比以下两个Log信息,后者比前者更有作用。
3.2、Error或者Warn级别中碰到Exception的情况尽量log完整的异常信息
Error和Warn级别是比较严重的情况,意味着系统出错或者危险,我们需要更多的信息来帮助分析原因,这个时候越多的信息越有帮助。包含以下内容:
1) 你是在做什么事情的时候出错了
2) 你是在用什么数据做这个事情的时候出错了
3) 出错的信息是什么
对比下面三个Log语句,第一个提供了详尽的信息,第二个只提供了部分信息,Exception的Message不一定包含有用的信息,第三个只告诉你出错了,其他的你一无所知:
1) Log.error(“获取用户[{}]的用户信息时出错”,username,ex);
2) Log.error(“获取用户[{}]的用户信息时出错”,username,ex.getMessage());
3) Log.error(“获取用户[{}]的用户信息时出错”);
3.3、基本的Logger编码
1) 在一个对象中通常只使用一个Logger对象,Logger应该是static final的,只有在少数需要在构造函数中传递logger的情况下才使用private fianl。
Static final Logger logger = LoggerFactory.getLogger(Main.class);
2) 输出Exceptions的全部Throwable信息,因为logger.error(msg)和logger.error(msg,e.getMessage())这样的日志输出方法会丢失掉最重要的StackTrace信息。
Void foo(){
Try{
......
}catch(Exception e){
Logger.error(e.getMessage());//错误
Logger.error(“msg”,e.getMessage());//错误
Logger.error(“msg”,e);//正确
}
}
3) 对与不是特别重要的异常,不允许记录日志后又抛出异常,因为这样会多次记录日志,只允许记录一次
Try{
......
}catch(Exception ex){
Logger.error(errorMessage,ex);
Throw new UserSercviceException(errorMessage,ex);
}
4) 不允许出现System print(包括System.out.println和System.error.println)语句。
5) 不允许出现e.printStackTrace。
6) 日志性能的考虑,如果代码为核心代码,执行频率非常高,则输出日志建议增加判断,尤其是低级别的输出<debug、info、warn>。
7) 有意义的日志
通常情况下在程序日志里记录一些比较有意义的状态数据:程序启动,退出的时间点:
程序运行消耗时间;耗时程序的执行进度;重要变量的状态变化。
除此之外,在公共的日志里规避打印程序的调试或者提示信息。
说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx