@Aspect
@Component
@Slf4j
public class ServiceExceptionAspect {
@Around("execution(* com.sankuai.groceryauth.auth.poiquery.service.thrift..*.*(..)) || " +
"execution(* com.sankuai.groceryauth.auth.poiquery.service.crane..*.*(..))")
public Object doAop(ProceedingJoinPoint pjp) throws Throwable {
String targetClassName = pjp.getTarget().getClass().getSimpleName();
MethodSignature signature = (MethodSignature) pjp.getSignature();
String methodName = signature.getName();
String methodFullName = targetClassName + "." + methodName;
Object[] args = pjp.getArgs();
log.info("method called:{},param:{}", methodFullName, args);
Method setCode = Arrays.stream(signature.getReturnType().getMethods())
.filter(method -> "setCode".equalsIgnoreCase(method.getName()))
.findFirst()
.orElse(null);
Method setMsg = Arrays.stream(signature.getReturnType().getMethods())
.filter(method -> "setMsg".equalsIgnoreCase(method.getName()))
.findFirst()
.orElse(null);
if (setMsg == null) {
setMsg = Arrays.stream(signature.getReturnType().getMethods())
.filter(method -> "setMessage".equalsIgnoreCase(method.getName()))
.findFirst()
.orElse(null);
}
try {
Object result = pjp.proceed();
return result;
} catch (IllegalArgumentException e) {
if (setMsg != null && setCode != null) {
Object result = signature.getReturnType().newInstance();
setCode.invoke(result, Constants.BAD_PARAMETERS);
setMsg.invoke(result, e.getMessage());
log.info("IllegalArgumentException :", e);
return result;
}
throw e;
} catch (AuthTException e) {
int code = e.getCode();
String message = e.getMessage();
log.warn("ServiceExceptionAspect catch BusinessException, method:{},param:{}, code:{}, message:{}",
methodFullName, args, code, message, e);
doCatLog(methodFullName, e);
if (setMsg != null && setCode != null) {
Object result = signature.getReturnType().newInstance();
setMsg.invoke(result, e.getMessage());
setCode.invoke(result, e.getCode());
return result;
}
throw e;
} catch (Throwable e) {
log.error("TServiceExceptionAspect catch Throwable, method:{},param:{}", methodFullName, args, e);
doCatLog(methodFullName, e);
if (setMsg == null || setCode == null) {
throw e;
} else {
Object result = signature.getReturnType().newInstance();
setMsg.invoke(result, "系统内部错误");
setCode.invoke(result, Constants.INTERNAL_ERROR);
return result;
}
}
}
private void doCatLog(String methodFullName, Throwable e) {
if (e instanceof AuthTException) {
AuthTException ex = (AuthTException) e;
int code = ex.getCode();
String message = ex.getMessage();
logBusinessException(methodFullName, ex, code, message);
} else {
Cat.logEvent("SystemError", methodFullName);
Cat.logErrorWithCategory("SystemError-" + methodFullName, "traceId:" + Tracer.id(), e);
MetricHelper.build().name("SystemError").tag("method", methodFullName).count();
}
}
private void logBusinessException(String methodFullName, Exception ex, int code, String message) {
Cat.logEvent("BusinessException-" + code, methodFullName);
MetricHelper.build().name("BusinessException-" + code).tag("method", methodFullName).count();
if (code == Constants.GATEWAY_ERROR) {
Cat.logEvent("GatewayError", methodFullName);
Cat.logErrorWithCategory("GatewayError-" + methodFullName, "traceId:" + Tracer.id() + "." + message, ex);
MetricHelper.build().name("GatewayError").tag("method", methodFullName).count();
}
}
}
Java 输出本地方法metho
最新推荐文章于 2024-05-03 16:12:22 发布