【发布时间】:2018-03-02 17:16:35
【问题描述】:
Sonar 在捕获泛型类型 Exception 时会报错,但有时我们需要对所有(甚至尚未识别的)异常类型进行一些常规异常处理。通过此声纳检查的解决方案是什么?
【问题讨论】:
Sonar 在捕获泛型类型 Exception 时会报错,但有时我们需要对所有(甚至尚未识别的)异常类型进行一些常规异常处理。通过此声纳检查的解决方案是什么?
【问题讨论】:
除非您正在调用抛出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 的处理,因此您会默默地吞下中断,这可能是问题的根源。
相反,如果您捕获了RuntimeException 或RuntimeException | IOException | OtherExceptionYouAlreadyKnowAbout,编译器会标记您必须更改代码才能处理该InterruptedException;或者,您不能更改someMethod() 的签名,并且必须在那里处理已检查的异常。
【讨论】: