gpt4 book ai didi

java - 使用 Spring AOP 清理记录器

转载 作者:行者123 更新时间:2023-12-02 03:02:58 26 4
gpt4 key购买 nike

我们正在尝试在我们的应用程序中引入通用记录器,使用 Spring AOP 来记录 catch block 下的日志语句。

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 文档之后,我发现这可以使用 AfterThrowing 建议来完成。抛出通知后是如果方法因抛出异常而退出则要执行的通知。

为了做到这一点,我们将通过在 catch block 内重新抛出 Exception 来更改现有的异常处理代码,例如 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 block 中重新抛出异常并根据调用层次结构向上传播它?

请注意,任何引发的或未经检查的异常都会被 AfterThrowing Advice 捕获。我想做的就是通过删除 catch block 内的 log.error 来执行记录器清理,并使用 AOP 使其通用。

最佳答案

正如这里所讨论的,@AfterThrowing 非常适合记录实际上抛出的异常。

您的情况非常特殊,因为您想要记录捕获/处理的异常。如果你use full AspectJ对于此用例,您可以使用 handler(*) 切入点来代替 Spring AOP,如 this answer 中的示例代码所述。 。它将使您能够从 catch block 中提取出日志语句,而无需升级(重新抛出)已正确处理的异常,从而更改您的逻辑并使其有必要捕获它们稍后在其他地方。

关于java - 使用 Spring AOP 清理记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57039598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com