如何创建自定义声纳规则以检查方法是否抛出某个异常?

时间:2016-09-16 08:00:08

标签: sonarqube

所以我们要检查一个特定的方法,比如某些java类中的findOne(),如果它抛出一个特定的异常。如果它没有抛出异常,那么就要在方法级别报告一个问题。

我们可以使用

public void visitThrowStatement(ThrowStatementTree tree)

但只有当有一个抛出异常的语句时才调用它,我们如何检查它是否被抛出?

1 个答案:

答案 0 :(得分:1)

您需要在访问者中保留一个上下文,以了解您当前正在访问throw语句的方法。

基本上,如果你在findOne方法内,那么你将访问该方法的代码,如果它有正确的抛出语句,那么不要提出问题,但如果没有那么提出一个问题。

某些事情(这是伪代码,当然应该进行调整,但这将解释这个概念):

LinkedList<MethodTree> stack;
int throwCount = 0;
void visitMethod(MethodTree methodTree) {
   stack.push(methodTree);
   throwCount = 0;
   super.visitMethod(methodTree);
   if(throwCount == 0) {
      //raise Issue
   }
}

void visit throwStatement(ThrowStatementTree tree) {
   if(isCorrectExceptionThrown(tree)) {
     throwCount++;
   }
}