背景:
项目service层因数据错误或其他因素需要向消费者抛出自定义异常,而ExceptionFilter类会将自定义异常处理成RuntimeException,导致自定义异常失效、
我的处理方法
service层直接抛出RpcException,消费者层使用aop获取异常并使用自定义返回体返回对应的状态码与错误信息。前端可收到正常返回体格式
public class AopTest {
@Pointcut(value = "execution(public * com.zequal.blshop.*.controller..*(..))")
public void mt(){};
@Around("mt()")
public Object around(ProceedingJoinPoint joinPoint) {
long startTime = System.currentTimeMillis();
Object o = null;
try {
o = joinPoint.proceed();
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
String className = methodSignature.getName();
String methodName = methodSignature.getDeclaringTypeName();
long currentTime = System.currentTimeMillis();
log.info("{}#{}方法请求耗时:{}ms" ,className,methodName, currentTime - startTime );
} catch (Throwable throwable) {
//获取到异常进行处理
o = handlerException(joinPoint, throwable);
}
return o;
}
private Result handlerException(ProceedingJoinPoint pjp, Throwable e) {
Result resultEntity = null;
//异常为Rpc则返回状态码与消息
if (e instanceof RpcException) {
//我的返回提状态码为枚举,需要对应转换
resultEntity = Result.fail(Result.HttpStatusEnum.valueOf(((RpcException) e).getCode()), e.getMessage());
}else if (e instanceof RuntimeException) {
resultEntity = Result.fail(Result.HttpStatusEnum.valueOf(403), e.getMessage());
} else {
//logger.error("异常{方法:" + pjp.getSignature() + ", 参数:" + pjp.getArgs() + ",异常:" + e.getMessage() + "}", e);
resultEntity = Result.fail(Result.HttpStatusEnum.FORBIDDEN, e.getMessage());
}
return resultEntity;
}
}
遗留问题
这种方法会混淆异常的源头,不知道异常来自RPC框架本身还是自主抛出。
优点:
相对而言对框架的改动最小并且service层不用进行任何的处理与自定义异常引入,不知道有没有更好的处理方法。