现象:
日常维护系统过程中,发现log中经常出现因RecordNotExistException()打印出的stacktrace,并没有出现业务上的问题,但是容易混淆视线,而且占用内存。组长就让排查下这个log存在的意义,是否是业务上的正常case。以进行后续的优化。
排查:
经查发现,这是我们自定义的一个异常类,当时是前同事负责此处逻辑处理。可能当时就是为了打印此处异常stacktrace。但是现在感觉日志级别有些高,没有必要。于是决定不再输出stacktrace,减少内存占用和视线混淆。
处理:
发生此异常的位置以及抛出异常的方法。
发现异常捕获是在外边,而且不单纯是为了捕获getByUUIDAndApp的异常,还有可能存在其他方法等的其他异常信息,比如NullPointerException,ClassNotFoundException等RuntimeException,所以也不能说为了不抛RecordNotExistException()就直接将
logger.error("发生了异常,{}",e);
修改成
logger.warn("RecordNotExistException : ",e.getMessage());
所以解决方案如下,有两种,(优选方案一):
方案一:将本次打印无意义stacktrace的自定义异常类RecordNotExistException()另行处理,其他异常依然按原有方式进行处理。
@Override
public void onException (Exception e){
if (e instanceof RecordNotExistException) {
logger.warn("RecordNotExistException : ", e.getMessage());
} else {
logger.error("发生了异常,{}", e);
}
}
方案二:在原始调用getByUUIDAndApp的方法call()中捕获到异常后,不抛出即可。
try {
deviceUserEntity = DeviceTokenBiz.this.deviceBiz.getByUUIDAndApp(oldDeviceUUID, appId);
} catch (RecordNotExistException e) {
}
题外话:
为什么不直接在getByUUIDAndApp直接使用log.warn呢?因为这个方法很可能被的类或工程引用,能不改尽量还是不改的。虽然修改之后对当前项目没有其他影响。
补充:
异常信息打印的不同效果。各取所需。