用于检查Java中的catch子句的自定义XPath规则

时间:2014-09-04 14:15:08

标签: java xpath sonarqube

我想通过其检查以下案例的Web界面向SonarQube引入新的自定义XPath规则

try{
  doStuff();
} catch (SomeException e) {
  handleException(e);
}

应突出显示。而

try{
  doStuff();
} catch (SomeException e) {
  LOG.info(e.getMessage() + " other stuff");
  handleException(e);
}

应该是理想的形式。知道如何通过XPath表达它吗?

1 个答案:

答案 0 :(得分:2)

我猜你正在撰写有关PMD规则的文章。这是XPath,它匹配所有catch语句,这些语句没有在任何地方调用的方法LOG.info

//CatchStatement[not(descendant::PrimaryPrefix/Name[@Image='LOG.info'])]

例如,对于该代码:

import java.util.logging.Logger; 

public class Test { 
private Logger LOG = Logger.getLogger(""); 

    public void main(String[] args) {
        try {
            doStuff();
        } catch (SomeException e) { // HERE VIOLATION
            handleException(e);
        }
        try { 
            doStuff(); 
        } catch (SomeException e) { 
            LOG.info(e.getMessage() + " other stuff"); 
            handleException(e); 
        }
    }
}

它会在第9行(} catch (SomeException e) { // HERE VIOLATION)发现规则违规,因为该行是不包含LOG.info的catch语句。

我建议您使用PMD设计器应用程序编写更复杂的PMD。它生成java代码的抽象语法树,并提供编写和检查XPath规则的可能性。你可以找到它here