【问题标题】:Sonarqube - avoiding catch generic ExceptionSonarqube - 避免捕获通用异常
【发布时间】:2018-03-02 17:16:35
【问题描述】:

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

【问题讨论】:

标签: java sonarqube


【解决方案1】:

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

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

例如:

void someMethod() {
  // Do stuff.
}

void callIt() {
  try {
    someMethod();
  } catch (Exception e) {
    // ...
  }
}

如果 someMethod 现在更改为抛出 InterruptedException

void someMethod() throws InterruptedException {
  Thread.sleep(1000);
  // Do stuff.
}

编译器不会告诉您需要在callIt() 中添加对InterruptedException 的处理,因此您会默默地吞下中断,这可能是问题的根源。

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

【讨论】:

  • 使用 RuntimeException 可以解决问题,但我认为 RuntimeException - 遵循 Sonar 单独处理异常的想法 - 也是通用的。在我的具体情况下,我使用 Jaxb 来解组 XML 字符串。编译器只告诉我 JAXBException,但现在当 XML 字符串在值中包含类似 &foo(不带分号)的内容时,异常是 com.ctc.wstx.exc.WstxLazyException。
  • @Nader 它也是通用的,但它是一个未经检查的例外:您并非真的打算以有意义的方式尝试(或能够)从中恢复,因为它表示编程错误。只是说“嗯,发生了问题;不要破坏世界,但没有什么可做”是合理的。另一方面,已检查的异常表示您应该能够做一些事情以从中恢复(例如重试,因为我只是在此调用时被打断,下次它可能会成功)。
  • 很好解释!我不知道选中/未选中。谢谢。
  • @Nader 你可能想阅读stackoverflow.com/questions/6115896/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2010-09-29
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2012-12-26
相关资源
最近更新 更多