应用场景
- 接口返回值
异常枚举类
public enum ResultCode { /** * 成功 */ SUCCESS(200, "接口调用成功"), /**/ SIGN_ERROR(300,"验签失败"), INNER_SERVER_ERROR(500, "服务器内部错误"), UNAUTHORIZED(401, "Unauthorized"), /**/ PAY_EXPIRED(1001, "超时"), DUPLACATE_REQ(1002, "重复提交"), PARAM_VALIDATE_FAIL(1003, "参数错误"), RESOURCE_NOT_EXISTS(1004, "资源不存在"), ; public final int code; public final String msg; public SystemException exception() { return new SystemException(this.code, this.msg); } public SystemException exception(String msg) { return new SystemException(this.code, msg); } public SystemException exception(Throwable cause) { return new SystemException(this.code, this.msg, cause); } public SystemException exception(String msg, Throwable cause) { return new SystemException(this.code, msg, cause); } }
业务异常类
@Getter public class SystemException extends RuntimeException { private int code = 500; private HashMap<String, Object> value; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public SystemException() { } public SystemException(int code) { this.code = code; } public SystemException(int code, String message) { super(message); this.code = code; } public SystemException(int code, String message, Throwable cause) { super(message, cause); this.code = code; } public SystemException(Throwable cause) { super(cause.getMessage(), cause); } public SystemException(String pattern, Object[] args, Throwable cause) { super(String.format(pattern, args), cause); } public SystemException(int code, String pattern, Object[] args, Throwable cause) { super(String.format(pattern, args), cause); this.code = code; } public SystemException(int code, String pattern, Object... args) { super(String.format(pattern, args)); this.code = code; } public SystemException(String pattern, Object[] args) { super(String.format(pattern, args)); } public SystemException(String message) { super(message); } public SystemException(String message, Throwable cause) { super(message, cause); } public void setValue(HashMap<String, Object> value) { this.value = value; } }
统一异常处理器
/** * 统一异常处理注册器 */ @ControllerAdvice(annotations = RestController.class) public class ExceptionRegister { private LoadingCache<String, Logger> LOGGER = CacheBuilder.newBuilder() .build(new CacheLoader<String, Logger>() { @Override public Logger load(String key) throws Exception { return LoggerFactory.getLogger(key); } }); @ExceptionHandler(SystemException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public RestResult<?> handleSystemException( HttpServletRequest request, HttpServletResponse response, SystemException ex) { getLogger(ex).warn(ex.getMessage()); if (ex.getValue() != null) { return new RestResult<>(ex.getCode(), ex.getMessage(), ex.getValue()); } return new RestResult<>(ex.getCode(), ex.getMessage(), Maps.newHashMap()); } @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public RestResult<?> handleException( HttpServletRequest request, HttpServletResponse response, Exception ex) { getLogger(ex).error(ex.getMessage(), ex); return new RestResult<>(500, "Server Err", Maps.newHashMap()); } private Logger getLogger(Exception ex) { StackTraceElement traceElement = ex.getStackTrace()[0]; return LOGGER.getUnchecked(traceElement.getClassName()); } }
使用举例
// 抛出带返回值的业务异常 SystemException exception = ResultCode.ALREADY_PAY_SUCCESS.exception(e.getErrorMessage(), e); HashMap<String, Object> map = Maps.newHashMap(); map.put("tradeOrderId", tradeOrderId); exception.setValue(map); throw exception;
// 抛出普通业务异常 throw ResultCode.REFUND_SUCCESS.exception();