在Java中,通常情况下,需要将异常堆栈信息输出到日志中,这样便于纠错及修正Bug,而多数情况下,大家最常用的是使用e.printStackTrace()直接打印堆栈信息完事,这并不是值的推荐的做法。
1. 当出现异常时,调用e.printStackTrace();其实相当于什么都没做,同时也不会把异常信息输出到日志文件中
2. 使用log.error(e.getMessage());只能够输出异常信息,但是并不包括异常堆栈,所以无法追踪出错的源点
3. 使用log.error(e);除了输出异常信息外,还能输出异常类型,但是同样不包括异常堆栈,该方法doc说明为:Logs a message object with the ERROR level.显然并不会记录异常堆栈信息
4. 当然也可以自己手动写个工具类,来挨个输出e.getStackTrace();获得的堆栈信息,显然繁琐麻烦
5. 其实在log4j中只需要这样调用,就可以获得异常及堆栈信息log.error(Object var1, Throwable var2);,该方法doc说明为:Logs a message at the ERROR level including the stack trace of the Throwable t passed as parameter.
例如:
@Override
public void autoDeleteKnowleagePackage(String projectCode,long id, SysUser user,FileType fileType) {
try {
//删除知识包关联
List<ResourcePackage>packages= null;
packages = repositoryService.loadProjectResourcePackages(projectCode);
ListIterator<ResourcePackage> ite = packages.listIterator();
while(ite.hasNext()){
ResourcePackage row =ite.next();
if(row.getName().equals(fileType.getTypecode()+id)){
ite.remove();
}
}
XStream xStream=new XStream(new Xpp3Driver(new NoNameCoder()));
xStream.registerConverter(new XStreamDateConverter());
xStream.alias("res-packages",List.class);
String xml=XmlUtil.beanToXml(packages,xStream);
String path="/"+projectCode+"/"+RuleConstant.RES_PACKGE_FILE;
repositoryService.saveFile(path,xml,false,null,user);
} catch (Exception e) {
log.error("异常信息:",e);
}
}