Java Sonarqube-避免捕获泛型异常
Sonar在捕获泛型类型异常时会发出抱怨,但有时我们需要对所有(甚至尚未识别)异常类型执行一些常规异常处理。通过此声纳检查的解决方案是什么?除非您调用抛出异常的方法,否则无需捕获异常:捕获您知道的异常,编译器将告诉您何时必须开始处理另一个异常 捕获“尚未识别”Java Sonarqube-避免捕获泛型异常,java,sonarqube,Java,Sonarqube,Sonar在捕获泛型类型异常时会发出抱怨,但有时我们需要对所有(甚至尚未识别)异常类型执行一些常规异常处理。通过此声纳检查的解决方案是什么?除非您调用抛出异常的方法,否则无需捕获异常:捕获您知道的异常,编译器将告诉您何时必须开始处理另一个异常 捕获“尚未识别”异常的问题在于,您丢失了必须以特殊方式处理新异常的信号 例如: void someMethod() { // Do stuff. } void callIt() { try { someMethod(); } catc
异常的问题在于,您丢失了必须以特殊方式处理新异常的信号
例如:
void someMethod() {
// Do stuff.
}
void callIt() {
try {
someMethod();
} catch (Exception e) {
// ...
}
}
如果现在更改了someMethod
,使其抛出一个中断异常
:
void someMethod() throws InterruptedException {
Thread.sleep(1000);
// Do stuff.
}
编译器没有告诉您需要为callIt()
中的InterruptedException
添加处理,因此您将默默地接受中断,这可能是问题的根源
相反,如果您捕获了RuntimeException
,或RuntimeException | IOException | otherexception您已经了解了,编译器将标记您必须更改代码才能处理该中断异常
;或者,您无法更改someMethod()
的签名,并且必须在此处处理选中的异常。忽略警告?使用RuntimeException可以解决这个问题,但我认为RuntimeException是通用的,遵循Sonar单独处理异常的思想。在我的具体例子中,我使用Jaxb来解组XML字符串。编译器只告诉我JAXBException,但现在当XML字符串的值中包含类似&foo(不带分号)的内容时,异常是com.ctc.wstx.exc.WstxLazyException。@纳德它也是通用的,但它是未经检查的异常:您实际上不打算尝试(或能够)以有意义的方式从中恢复,因为它表示编程错误。仅仅说“嗯,发生了一个问题;不要拆毁这个世界,但是没有什么可以做的”是合理的。另一方面,选中的异常表示您应该能够执行一些恢复操作(例如重试,因为我只是在这次调用中被中断了,下次可能会成功)。解释得很好!我没有意识到检查/未检查。谢谢。@Nader您可能需要阅读