我正在编写这段代码,PMD 提示说
名称
私有(private)方法 void xyzMethod(AnyObject anyObject)
位置
类 XYZClass (xyz.package)
问题概要
正在对捕获的异常执行 instanceof 检查。为此异常类型创建一个单独的 catch 子句。
try {
premium = serviceCallEjb(anfrage);
} catch (Exception e){
final int typeError;
if(e instanceof ServiceException){
typeError = CcaLogManager.ERROR;
e.printStackTrace();
} else {
typeError = CcaLogManager.WARN;
}
myAnfrage.setStatus(DcAnfrage.ProcessingError);
myAnfrage.setStatusInfo(e.getMessage());
final String message = String.format("Error in CcaMotorinsuranseCalculator, caught: %s, message: %s",e.getClass().getName(),e.getMessage());
CcaLogManager.log(typeError, message);
}
你喜欢我这样写吗?
我还可以进行其他优化吗?
try {
premium = serviceCallEjb(anfrage);
}
catch(ServiceException e){
final int typeError;
typeError = CcaLogManager.ERROR;
e.printStackTrace();
processException(e, typeError);
}
catch (Exception e){
final int typeError;
typeError = CcaLogManager.WARN;
processException(e, typeError);
}
private <T extends Exception> void processException(T e, final int typeError){
this.myObject.setStatus(/*Any number*/7);
this.myObject.setStatusInfo(e.getMessage());
final String message = String.format("Error in Some place, caught: %s, message: %s",e.getClass().getName(),e.getMessage());
Logger.log(typeError, message);
}
最佳答案
首先,我建议不要在任何生产代码中调用 e.printStackTrace()
。它将原始输出发送到进程的标准错误流,这在 EJB 应用程序中永远没有用处。无论如何,即使您最终打印到 stderr
,该逻辑也应该驻留在您的异常处理代码中。当您消除它时,您的代码可能如下所示:
try {
premium = serviceCallEjb(anfrage);
}
catch (Exception e){
processException(e, e instanceof ServiceException?
CcaLogManager.ERROR : CcaLogManager.WARNING);
}
鉴于这种形式,似乎甚至 instanceof
逻辑也可以成为 processException
作业描述的一部分。这样,一个方法就可以捕获整个应用程序中异常处理的所有业务规则。
如果您的唯一目标是满足 PMD,那么这将是一个干净的版本:
try {
premium = serviceCallEjb(anfrage);
}
catch (ServiceException e){
processException(e, CcaLogManager.ERROR);
}
catch (Exception e){
processException(e, CcaLogManager.WARNING);
}
关于java - 我可以实现更多优化来记录异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31514772/