当此方法为aspect-wrapped
时,可以避免在方法签名中声明已检查的异常。我有以下内容:
自定义例外,我无法修改(提供)
class MyEx extends Exception {
...
}
引发异常的方法:
public MyObject readCounter() throws MyEx {
^^^^^^^^^^^^
// Would like to avoid declaring this
...
}
此方法包装有AOP Spring方面:
@Around("execution(* com.mypackage.myService.*(..))" +
" && @annotation(com.mypakage.service.annotation.AspectWrapped) && args(args)")
public Object aroundServiceCallMethod(ProceedingJoinPoint point, Object args) throws SomeAnotherException {
try {
Object result = point.proceed();
} catch (Throwable e) {
// Ignore
}
return null;
}
您可以看到,方法readCounter
永远不会抛出MyEx
检查的异常,因为方面aroundServiceCallMethod
在这里禁止所有异常。
为了避免在方法签名中声明readCounter
,我可以对方法aroundServiceCallMethod
或方面方法throws MyEx
进行处理吗?
对我来说,唯一的破解是Lombok的SneakyThrows,但这并不是我所相信的最好的,因为我仍然需要在注释中声明Exception。
readCounter()抛出MyEx的原因是什么?是因为该类正在实现接口,还是因为其中的代码引发了异常?
如果实现接口,则该方法不能在合同中引发异常。
如果异常是由代码逻辑引发的,则可以在try-catch块中进行处理。
在两种情况下,都可以将代码中的检查后异常包装到运行时异常中并抛出。这应该在建议中处理。