Sonarqube - 避免捕获通用异常

Nad*_*der 5 java sonarqube

Sonar 在捕获泛型类型Exception时会抱怨,但有时我们需要对所有(甚至尚未识别)异常类型进行一些常规异常处理。通过这次声纳检查的解决方案是什么?

And*_*ner 4

除非您调用 throws 的方法Exception,否则无需 catch Exception:捕获您知道的异常,编译器会告诉您何时必须开始处理另一个异常。

捕获“尚未识别”的问题Exception是您丢失了必须以特殊方式处理新异常的信号。

例如:

void someMethod() {
  // Do stuff.
}

void callIt() {
  try {
    someMethod();
  } catch (Exception e) {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

如果someMethod现在被更改,以便它抛出,比如说,一个InterruptedException

void someMethod() throws InterruptedException {
  Thread.sleep(1000);
  // Do stuff.
}
Run Code Online (Sandbox Code Playgroud)

编译器不会告诉你需要添加处理InterruptedExceptionin 的处理callIt(),因此您将默默地接受中断,这可能是问题的根源。

相反,如果您捕获了RuntimeException, 或RuntimeException | IOException | OtherExceptionYouAlreadyKnowAbout,编译器会标记您必须更改代码才能处理该问题InterruptedException;或者,您无法更改 的签名someMethod(),并且必须在那里处理已检查的异常。