ExceptionAspect-异常处理

ExceptionAspect

package com.mozhu.common.aspect.exception;

import com.mozhu.common.bean.JsonResult;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * 切面
 * 处理异常及日志
 */
@Aspect
@Component
public class ExceptionAspect {

    public static Logger logger = LoggerFactory.getLogger(ExceptionAspect.class);

    private final String loginUrl = "";
    /**
     * 切点,切所有业务层及接口
     * execution(* com.mozhu.bssh..*.*Service.* (..)) or execution(* com.mozhu.bssh..*.*Controller.* (..))
     */
    private final static String CUT_POINT = "execution(* com.mozhu.bst..*.*Controller.* (..)) or execution(* com.mozhu.bst.system.service.impl.SysUserServiceImpl.* (..))";

    @Around(value = CUT_POINT)
    public Object exceptionAspect(ProceedingJoinPoint target) {
        try {
            Object obj = target.proceed();
            return obj;
        } catch (Throwable e) {
            // 业务异常
            if (e instanceof BusinessException) {
                logger.warn(e.getMessage());
                // 非登录异常,传警告异常到前端
                return new JsonResult<Object>(JsonResult.WARNING, e.getMessage());
            } else {
                // 未知异常,传错误异常到前端
                GlobalException globalException = new GlobalException(e);
                logger.error("ExceptionId:{}", globalException.getExceptionId());
                e.printStackTrace();
                return new JsonResult<Object>(JsonResult.ERROR, "程序执行失败。ExceptionId:" + globalException.getExceptionId());
            }
        }
    }

    /**
     * 获取异常行数
     *
     * @param target
     * @param e
     * @return
     */
    private Integer getErrorLineNumber(ProceedingJoinPoint target, Throwable e) {
        Class<?> cls = target.getTarget().getClass();
        String clsName = cls.getName();
        String methodName = target.getSignature().getName();

        int n = 0;
        for (int i = 0; i < e.getStackTrace().length; i++) {
            StackTraceElement stackTraceElement = e.getStackTrace()[i];
            if (clsName.equals(stackTraceElement.getClassName()) && methodName.equals(stackTraceElement.getMethodName())) {
                n = e.getStackTrace()[i].getLineNumber();
            }
        }
        return n;
    }


    public class RequestMessage {
        private String clsName;
        private String methodName;
        private String requestName;

        public String getClsName() {
            return clsName;
        }

        public void setClsName(String clsName) {
            this.clsName = clsName;
        }

        public String getMethodName() {
            return methodName;
        }

        public void setMethodName(String methodName) {
            this.methodName = methodName;
        }

        public String getRequestName() {
            return requestName;
        }

        public void setRequestName(String requestName) {
            this.requestName = requestName;
        }
    }
}

面向切面编程(AOP)的主要目的是将横切关注点(如日志记录、性能统计和事务处理等)与核心业务逻辑分离。在异常处理方面,AOP可以帮助我们将异常处理逻辑从业务代码中抽离出来,提高代码的可读性和可维护性。 以下是一个基于AOP的Java异常处理示例: 1. 定义一个异常处理类,该类实现了Spring框架的AfterThrowingAdvice接口: ```java public class ExceptionHandler implements AfterThrowingAdvice { public void afterThrowing(Method method, Object[] args, Object target, Exception ex) { // 根据异常类型进行不同的处理 if (ex instanceof BusinessException) { // 业务异常 // 记录日志或者发送通知等操作 } else if (ex instanceof SystemException) { // 系统异常 // 发送通知或者触发告警等操作 } else { // 其他异常 // 记录日志或者发送邮件等操作 } } } ``` 2. 在Spring的配置文件中定义切面和切点: ```xml <bean id="exceptionHandler" class="com.example.ExceptionHandler" /> <aop:config> <aop:aspect ref="exceptionHandler"> <aop:pointcut id="exceptionPointcut" expression="execution(* com.example..*(..))" /> <aop:after-throwing pointcut-ref="exceptionPointcut" throwing="ex" method="afterThrowing" /> </aop:aspect> </aop:config> ``` 这里我们定义了一个切面ExceptionAspect,它引用了前面定义的ExceptionHandler类。我们使用<aop:pointcut>元素定义了一个切点,它匹配所有com.example包及其子包下的方法。最后,在<aop:after-throwing>元素中,我们将切点和异常处理方法关联起来。 3. 在业务代码中抛出异常: ```java public void doSomething() throws BusinessException { // ... if (someCondition) { throw new BusinessException("业务异常"); } // ... } ``` 在业务代码中,我们可以通过throw语句抛出业务异常。当异常被抛出时,AOP框架会自动调用ExceptionHandler中定义的afterThrowing方法进行处理。 通过使用AOP框架,我们可以将异常处理逻辑与业务代码分离,提高代码的可读性和可维护性。同时,我们也可以将不同类型的异常进行分类处理,以便更好地监控和管理系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值