spring使用了环绕通知后,全局异常捕获失效 解决办法

项目出现这个问题。本来全局异常捕获好好的。只要抛出自己写的自定义异常就会传给前端。但我加入了环绕通知后,发现全局异常失效了。

来看看我的全局异常

package com.yiban.suoai.exception;

import com.yiban.suoai.exception.SAException;

import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

// 统一的异常类进行处理(把默认的异常返回信息改成自定义的异常返回信息)
// SAException,将自动找到此类中对应的方法执行,并返回json数据给前台
@ControllerAdvice
public class ExceptionController {

    @ResponseBody
    @ExceptionHandler(value = SAException.class)    //异常处理器,SAException
    public Map<String, Object> hanlerException(HttpServletRequest request, SAException e){
        Map<String, Object> map=new HashMap<>();
        map.put("message",e.getMessage());
        map.put("error",e.getErrorCode());
        map.put("ErrorCode",e.getCode());
        return map;
    }
}

先了解下通知

通知(Advice):在AOP中,切面的工作被称为通知。通知定义了切面“是什么”以及“何时”使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。
Spring切面可以应用5种类型的通知:

  • 前置通知(Before):在目标方法被调用之前调用通知功能
  • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
  • 返回通知(After-returning):在目标方法成功执行之后调用通知
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知
  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行

环绕通知是最为强大的。他包括了上面的所有通知,也就包括了异常通知。

我就想,可能我的异常被环绕通知给捕获了。

 

看下环绕通知代码

  @Around("logAop() && args(email)")
  public void logAround(ProceedingJoinPoint jp, String email) {
      try {
          logger.debug("自定义前置通知Before>>>{}", email);
          jp.proceed();//将控制权交给被通知的方法,也就是执行sayHello方法
          logger.debug("自定义返回通知AfterReturning>>>{}", email);
      } catch (Throwable throwable) {
          logger.debug("异常处理>>>>{}", email);
          throwable.printStackTrace();
      }
       logger.debug("自定义后置通知After>>>{}", email);
  }

 

看到 原来异常真的被catch到了

那就简单了,直接在这里抛出异常

catch (Throwable throwable) {
    throw throwable;
}

 

 

问题完美解决

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Spring Boot提供了全局异常处理机制,可以通过以下几个步骤搭建全局异常捕获。 1. 创建一个全局异常处理类,使用@ControllerAdvice注解标记该类为全局异常处理类,并使用@ExceptionHandler注解定义要捕获异常类型。 2. 在全局异常处理类中编写异常处理方法,通过@ExceptionHandler注解标注,指定要捕获异常类型。在方法中可以定义异常处理的逻辑,比如返回自定义的错误信息、记录日志等。 3. 如果要返回自定义的错误信息,可以创建一个自定义的返回结果类,用于封装错误信息。在异常处理方法中将错误信息封装到自定义的返回结果类中,并将其返回给前端。 4. 使用@ControllerAdvice注解标记的全局异常处理类,会自动将其注册为bean,并作为全局异常处理器生效。 下面是一个简单的示例代码: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse error = new ErrorResponse(); error.setMessage("系统内部错误"); error.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR); } } public class ErrorResponse { private String message; private int status; // 省略getter和setter方法 } ``` 在上述示例中,我们通过@ControllerAdvice注解标记了一个全局异常处理类GlobalExceptionHandler,并通过@ExceptionHandler注解定义了handleException方法,用于捕获Exception类型的异常。在方法中,我们创建了一个ErrorResponse对象,并将错误信息封装到该对象中返回给前端。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值