SONAR扩展Exception或RuntimeException?

时间:2017-02-06 08:59:25

标签: java exception exception-handling sonarlint

我有一个自定义异常类,写为

 public class MyCustomException extends RuntimeException {
    public MyCustomException(Throwable cause) {
        super(cause);
      }

        enter code here

      /**
       * @param message
       * @param cause
       */
      public MyCustomException(String message, Throwable cause) {
        super(message, cause);
      }
    }

在我的serviceImpl图层

 @Override
        public List<SiteDetails> getSite() throws MyCustomException {
    }

SONAR(用于linting的Ecplise IDE插件)声明:

  

删除抛出异常的声明&#39; .MyCustomException&#39;哪一个   是运行时异常

我应该删除声明,还是应该在Exception课程而不是MyCustomException扩展RunTimeException

2 个答案:

答案 0 :(得分:1)

声纳问题主要是基于意见的问题 RuntimeException不会被强制处理并如此声明,但在记录此案例的方法中声明它并不是一种坏习惯。

  

我应该删除声明还是应该扩展Exception   MyCustomException类而不是RuntimeException

如果您认为MyCustomException是必须由客户处理的例外情况,则MyCustomException应来自Exception而不是RuntimeException

否则,如果在大多数情况下客户端无法处理异常,您应该删除声明以使Sonar Happy或标记(至少尝试)此问题作为误报如果您认为传达有意义异常,即使它是RuntimeException

答案 1 :(得分:0)

我有同样的情况,您必须捕获运行时异常,在我的情况下是Array Out Of Bound异常,原因是我解析了一个与特殊char值分开的字符串,但有时该字符串值与右边的字符不对应约定,对吗?所以我必须处理它,但是Sonar出于同样的原因而责备我! ArrayIndexOutOfBoundsException从运行时异常派生 ,无论如何,一旦您知道自己的代码块可以检索某些运行时异常,而不是直接抛出异常,就可以使用catch块并将其抛出自定义异常。

catch (ArrayIndexOutOfBoundsException e) {
     throw new YourCustomException("your message",e);
}

通过这种方式,您可以删除方法上的throws签名,Sonar会很高兴