我们正在尝试使用Spring AOP在catch块下的日志语句中在我们的应用程序中引入通用记录器。
在AOP之前
try
{
\\Business Logic
}
catch(Exception e){
\\some recovery mechanism that won't be generic across different layers
log.error();//These statements needs to be moved to generic logger
}
在阅读了Spring Docs之后,我发现可以使用AfterThrowing建议来完成。 抛出建议后,如果方法因抛出异常而退出,则将执行建议。
为此,我们将通过在Exception
内重新抛出catch
块来更改现有的异常处理代码,以使AfterThrowing
的建议起作用。
AOP之后:
try
{
\\Business Logic
}
catch(Exception e){
\\some recovery mechanism that won't be generic across different layers
throw e;
}
AOP代码:
@Aspect
@Sl4j
@Component
public class LoggingAdvice {
@AfterThrowing(pointcut = "execution (* * com..*(..)", throwing = "e")
public void myAfterThrowing(JoinPoint joinPoint, Exception e) {
log.error("Exception occured",e);
}
}
您是否认为有比此方法更好的解决方案,而不是在catch块中重新抛出Exception并按照调用层次结构向上传播它?
请注意,任何引发或未经检查的异常都会被AfterThrowing Advice捕获。我要做的就是通过删除catch块内的log.error
来执行记录器清理,并使用AOP将其通用。
答案 0 :(得分:0)
更好的方法是删除catch
块,因为您仍然要使用@AfterThrowing
。并在该方面的执行之上实现您想要实现的一切。
答案 1 :(得分:0)
正如此处所讨论的,@AfterThrowing
非常适合记录实际上 被抛出的异常。
您的案例非常特殊,因为您要记录被 捕获/处理 的异常。如果在此用例中使用use full AspectJ而不是Spring AOP,则可以使用this answer中的示例代码所述的handler(*)
切入点。这将使您能够从catch
块中剔除日志语句,而无需升级(重新抛出)已经正确处理的异常,从而更改了逻辑并有必要在以后将其捕获到其他地方