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;
}

 

 

问题完美解决

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值