3

PMD 报告“正在对捕获的异常执行 instanceof 检查。为此异常类型创建单独的 catch 子句。” 对于下面的代码。

    String parameter;
    try {
        ...
    } catch (Exception e) {
        logFailure(e, parameter);

        if (e instanceof X) {
            throw new A(e);
        } else if (e instanceof Y
                || e instanceof Z) {
            throw new B(e);
        } 
        throw new InternalServerErrorException(e);
    }

如果我将上面的代码更改为下面,logFailure(e) 有 3 个重复,有没有更好的方法来消除这种 PMD 违规?

    String parameter;
    try {
        ...
    } catch (X e) {
        logFailure(e, parameter);
        throw new A(e);
    } catch (Y e) {
        logFailure(e);
        throw new B(e);
    } catch (Z e) {
        logFailure(e);
        throw new B(e);
    } catch (exception e) {
        logFailure(e);
        throw new InternalServerErrorException(e);
    }
4

3 回答 3

8
    String parameter;
    try {
        ...
    } catch (Exception e) {
        logFailure(e, parameter);
        throwException(e);
    }

    public void throwException(Exception e) throws Exception{
       if (e instanceof X) {
            throw new A(e);
        } else if (e instanceof Y
                || e instanceof Z) {
            throw new B(e);
        } 
        throw new InternalServerErrorException(e);
    }

此外,您可以移至Loggermethod,具体取决于您的设计/应用程序

于 2013-07-19T09:12:34.830 回答
2

你可以这样做:(使用外部尝试捕获)

 String parameter;
 try {
    try {
        ...
    } catch (Exception e) {
        logFailure(e, parameter);
        throw e;
    }
 } catch (X e) {
        throw new A(e);
 } catch (Y e) {  
        throw new B(e);
 } catch (Z e) {
        throw new B(e);
 } catch (exception e) {
        throw new InternalServerErrorException(e);
 }
}
于 2013-07-19T09:12:47.227 回答
0

你可以做这样的事情

  try{
     // do some thing
    } catch (X |Y |Z | Exception e) {
        logFailure(e, parameter);
        throw new Exception(e);             
    }
于 2013-07-19T09:17:05.153 回答