软件编程
位置:首页>> 软件编程>> java编程>> 自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

作者:侯赛雷  发布时间:2023-04-04 05:26:04 

标签:注解,springAOPService,异常

一 自定义异常


/**
* 自定义参数为null异常
*/
public class NoParamsException extends Exception {
   //用详细信息指定一个异常
   public NoParamsException(String message){
       super(message);
   }

//用指定的详细信息和原因构造一个新的异常
   public NoParamsException(String message, Throwable cause){
       super(message,cause);
   }

//用指定原因构造一个新的异常
   public NoParamsException(Throwable cause) {
       super(cause);
   }
}

二 自定义注解


/**
* 统一捕获service异常处理注解
*/
@Documented
@Target({ElementType.METHOD, ElementType.TYPE}) //可在类或者方法使用
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceExceptionCatch {
}

三 注解切面处理类


@Component
@Aspect
@Slf4j
public class ServiceExceptionHandler {

@Around("@annotation(com.zhuzher.annotations.ServiceExcepCatch)  || @within(com.zhuzher.annotations.ServiceExcepCatch)")
   public ResponseMessage serviceExceptionHandler(ProceedingJoinPoint proceedingJoinPoint) {
       ResponseMessage returnMsg;
       try {
           returnMsg = (ResponseMessage) proceedingJoinPoint.proceed();
       } catch (Throwable throwable) {
           log.error("ServiceExcepHandler serviceExcepHandler failed", throwable);
           //单独处理缺少参数异常
           if(throwable instanceof NoParamsException) {
               returnMsg = ResponseMessage.failture(ErrorCode.ARG_CAN_NOT_BE_EMPTY);
           }else{//其他正常返回
               returnMsg=ResponseMessage.newErrorsMessage(throwable.getMessage());
           }
       }
       return returnMsg;
   }
}

自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

即可捕获改异常,并自定义处理逻辑!

捕获Service层异常,统一处理

新增注解,实现类和方法层级的异常捕获


package com.ahdruid.aop.annotation;
import java.lang.annotation.*;

/**
* 服务异常捕获,如捕获Service向外抛出的异常
* <p>
* 添加在类上、方法上
*
*/
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceExcepCatch {
}

异常处理handler


package com.ahdruid.aop;
import com.ahdruid.ReturnMsg;
import com.ahdruid.errorenums.BaseErrorEnum;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
* 服务异常捕获处理器
* <p>
* 如捕获Service向外抛出的异常
*
*/
@Component
@Aspect
@Slf4j
public class ServiceExcepHandler {

@Around("@annotation(com.ahdruid.aop.annotation.ServiceExcepCatch)  || @within(com.ahdruid.aop.annotation.ServiceExcepCatch)")
   public ReturnMsg serviceExcepHandler(ProceedingJoinPoint proceedingJoinPoint) {
       ReturnMsg returnMsg = new ReturnMsg();
       try {
           returnMsg = (ReturnMsg) proceedingJoinPoint.proceed();
       } catch (Throwable throwable) {
           log.error("ServiceExcepHandler serviceExcepHandler failed", throwable);
           returnMsg.setError(BaseErrorEnum.SYS_ERROR_UNKNOW);
       }
       return returnMsg;
   }
}

使用时,在类或者方法上加上注解@ServiceExcepCatch

来源:https://www.cnblogs.com/houzheng/p/11953183.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com