方面,异常处理程序不会捕获异常 Java Spring

aspects, exceptionhandlers don't catch exception java spring

提问人:wanderer 提问时间:8/12/2023 更新时间:8/12/2023 访问量:17

问:

注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BotExceptionCheck {

}
@Aspect
@Component
public class BotExceptionCheckAspect {
    SendMessageProducer sendMessageProducer;
    UserService userService;

    public BotExceptionCheckAspect(SendMessageProducer sendMessageProducer, UserService userService) {
        this.sendMessageProducer = sendMessageProducer;
        this.userService = userService;
    }

    @Around("@annotation(BotExceptionCheck)")
    public Object handleException(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = null;
        try {
            result = joinPoint.proceed();
        } catch (BotAuthorizeException ex) {
            var user = userService.findById(ex.getChatId());
            sendMessageProducer.sendMessage(SendMessage.builder()
                    .chatId(user.getChatId())
                    .text(ex.getMessage())
                    .build());
        }
        return result;
    }
}

抛出异常的方法

  @BotExceptionCheck
    public void checkSubscriptionForChannel(ChatMember chatMember) {
        if (chatMember.getStatus().equals("kicked") || chatMember.getStatus().equals("left")) {
            throw new BotAuthorizeException(String.valueOf(chatMember.getUser().getId()), """
                    You don't subscribe to the channel
                    """);
        }
    }

我也尝试编写异常处理程序,但它也没有看到异常

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    SendMessageProducer sendMessageProducer;
    UserService userService;

    public GlobalExceptionHandler(SendMessageProducer sendMessageProducer, UserService userService) {
        this.sendMessageProducer = sendMessageProducer;
        this.userService = userService;
    }

    @ExceptionHandler(BotAuthorizeException.class)
    public void handleBotAuthorizeException(BotAuthorizeException ex){
        var user = userService.findById(ex.getChatId());
        sendMessageProducer.sendMessage(SendMessage.builder()
                .chatId(user.getChatId())
                .text(ex.getMessage())
                .build());
    }
}

我在所有这些情况下都遇到异常: 2023-08-12 10:15:54.070 错误 11228 --- [legram Executor] o.t.t.u.DefaultBotSession:您不订阅该频道。

com.moviescreenbot.exceptions.authorize.BotAuthorizeException:您未订阅频道。

at com.moviescreenbot.services.user.UserService.checkSubscriptionForChannel(UserService.java:53) ~[main/:na]
at com.moviescreenbot.services.user.UserService.authorizeUser(UserService.java:24) ~[main/:na]
at com.moviescreenbot.services.user.UserService$$FastClassBySpringCGLIB$$64cf6081.invoke(<generated>) ~[main/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.20.jar:5.3.20]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.20.jar:5.3.20]
at com.moviescreenbot.services.user.UserService$$EnhancerBySpringCGLIB$$6ca7934e.authorizeUser(<generated>) ~[main/:na]

帮助解决此问题

java spring 异常 电报 aop

评论

0赞 kriegaex 8/14/2023
欢迎来到 Stack Overflow。请学习如何在 SO 上提问,并提供一个最小、完整且可验证的示例。谢谢。
0赞 kriegaex 8/14/2023
看,一堆代码片段而不是带有包名和导入的完整类以及 Spring 配置的问题,或者 - 更好的是 - 指向 GitHub 上最小复制器的链接是,有很多方法可以使 Spring AOP 出错:配置、自我调用、尝试针对 Spring 管理的 Bean 以外的东西、将原生 AspectJ 与 Spring AOP 混合。试图帮助你的人将不得不猜测。

答: 暂无答案