Sonarqube 定义了一条规则:永远不应该抛出通用异常(即抛出专用异常而不是使用通用异常。) 然而 AOP ProceedingJoinPoint 总是抛出泛型 Throwable 并且通常我对异常根本不感兴趣,只是从这样的方法中抛出它:
@Around(...)
public void someMethod(ProceedingJoinPoint point) throws Throwable {
// do something...
point.proceed();
// do something else...
}
显然这违反了上述Sonarqube规则。我真的必须用 try catch 包装它并记录可抛出的东西吗?这方面的最佳实践是什么?
您可以安全地将此违规标记为“误报”并输入描述性评论。这种误报应该很少见,以便您可以单独对待它们,并采取相应的行动 - AoP API 是一个很好的例子,遗留的和/或写得很糟糕的库是另一个例子。但请勿将文件添加到排除项,因为您会失去声纳分析中的其他规则
Throwable
或普通
Exception
本身的库。因此,当您处理此异常时,总会违反 sonarqube 的规则。但是你绝对应该捕获这个异常并用它做一些事情。您究竟用它做什么取决于捕获它的应用程序层。如果它是一个较低的异常,那么您可能希望将其包装到您自己的适当的异常中。考虑到所有其他更高层都不想知道您使用哪些依赖项。如果您自己是高层,那么您可以记录它或为用户返回正确的消息。我希望这有帮助。
public void someMethod(ProceedingJoinPoint point) {
try {
point.proceed();
} catch (Throwable t) {
if (t instanceof SQLException sqlException) {
throw sqlException;
} else if (t instanceof RuntimeException runtimeException) {
throw runtimeException;
} else {
// your own exception
throw new customException("Error during method execution", t);
}
}