| package com.dy.common.webUtil; | 
|   | 
| import io.swagger.v3.oas.annotations.tags.Tag; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.aspectj.lang.ProceedingJoinPoint; | 
| import org.aspectj.lang.annotation.Around; | 
| import org.aspectj.lang.annotation.Aspect; | 
| import org.aspectj.lang.annotation.Pointcut; | 
| import org.springframework.stereotype.Component; | 
|   | 
| /** | 
|  * 全局异常处理,处理在Controller中抛出的异常,在Controller之前(如Fileter)发生的错误或异常由GlErrorCtrl处理 | 
|  * 此类是基于注解切面实现, | 
|  * 另一种实现方式是基于拦截器和实现指定接口(GlExceptionHandler) | 
|  */ | 
| //@Tag(name = "全局异常处理", description = "处理在Controller中抛出的异常,在Controller之前(如Fileter)发生的错误或异常由GlErrorCtrl处理") | 
| //@Aspect | 
| @Slf4j | 
| //@Component | 
| public class GlExceptionAspect { | 
|   | 
|     //@Pointcut("execution(* com.dy..*(..))") | 
|     private void traceExceptionAspect() { | 
|     } | 
|   | 
|     //@Around("traceExceptionAspect()") | 
|     public Object around(ProceedingJoinPoint joinPoint) { | 
|         String interfaceName = String.format("%s.%s", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); | 
|         Object result; | 
|         try { | 
|             result = joinPoint.proceed(); | 
|         } catch (Throwable ex) { | 
|             if (ex instanceof GlException) { | 
|                 GlException e = (GlException) ex; | 
|                 result = BaseResponseUtils.buildFail(e.getMsg()); | 
|                 log.error(String.format("调用接口%s异常,错误信息:%s", interfaceName, e.getMsg()), e); | 
|             } else { | 
|                 result = BaseResponseUtils.buildFail("在Controller中或后产生异常:" + ex.getMessage()); | 
|                 log.error(String.format("调用接口%s异常,错误信息:%s", interfaceName, ex.toString()), ex); | 
|             } | 
|         } | 
|         return result; | 
|     } | 
| } |