java - 我可以实现更多优化来记录异常吗?

标签 java optimization

我正在编写这段代码,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/

相关文章:

java - 使用 JPA 的 @Transient 在 OData 元数据中不可见

java - jsp页面是什么类?

java - Struts 2 Junit 测试用例执行失败(StrutsTestCase.getActionProxy :138 » NullPointer)

java - 将列表中的元素映射到另一个列表中的位置

Javascript:有效地检查文本是否是完整的 HTML 文档

php - 如何设计高效的Like系统?

java - 优化大量 Scanner.findWithinHorizo​​n(pattern, 0) 调用

java - 所以这是代码 : But it never considers the first string i write? 即使它仅以第一个单词结尾,它也不会计算在内

python - str.find 怎么这么快?

python - 计算一组坐标之间的距离