项目异常处理方案

1、 定义一个枚举类

其中包含系统中可能出现的异常信息。根据系统的情况,为异常编号,例如12开头的是采购服务的异常、10是通用异常等。

 public enum BizCodeEnum {
    
    
    
        NON_PURCHASE_REQUEST(12001,"采购需求为空"),
        NON_PURCHASE_ORDER(12002,"采购单非法"),
    
        PRODUCT_UP_EXCEPTION(11000,"商品上架异常"),
    
        VALIDATE_EXCEPTION(10001,"数据校验错误"),
        UNKNOWN_EXCEPTION(10000,"未知异常");
    
        private int code;
        private String message;
    
        BizCodeEnum(int code, String message) {
    
    
            this.code = code;
            this.message = message;
        }
    
        public int getCode() {
    
    
            return code;
        }
    
        public String getMessage() {
    
    
            return message;
        }
    }

2、自定义一个异常类

其中包含一个成员变量 BizCodeEnum bizCodeEnum

    @Data
    public class CustomException extends RuntimeException {
    
    
    	private static final long serialVersionUID = 1L;
        private BizCodeEnum bizCodeEnum;
    	public CustomException(BizCodeEnum bizCodeEnum) {
    
    
    		this.bizCodeEnum = bizCodeEnum;
    	}
    }

3、定义一个统一返回类

每个系统中一般都会有这样一个类,在该类中添加一个方法,参数为接受一个上面定义的 BizCodeEnum codeEnum。目的是将错误信息封装到返回类中。

//本例是人人开源项目中的全局返回类R
public class R extends HashMap<String, Object> {
    
    
	private static final long serialVersionUID = 1L;
	public R() {
    
    
		put("code", 0);
		put("msg", "success");
	}

	public static R error(BizCodeEnum codeEnum) {
    
    
		R r = new R();
		r.put("code", codeEnum.getCode());
		r.put("msg", codeEnum.getMessage());
		return r;
	}
	
	//其他的省略
}

4、使用ControllerService进行全局异常捕获

@RestControllerAdvice
@Slf4j
public class GulimallExceptionControllerAdvice {
    
    

    @ExceptionHandler(CustomException.class)//专门处理上面的自定义异常
    public R handleCustomException(CustomException customException){
    
    
        log.error(customException.getBizCodeEnum().getMessage(),customException);
        return R.error(customException.getBizCodeEnum());
    }
}

5、实践

当某个代码片段中可能出现某个错误时,只需要在 BizCodeEnum中定义好异常code和错误信息,在可能出现的异常的代码片段中new一个 CustomException异常,并传入一个 BizCodeEnum,throw抛出去,客户端即可正确看到异常信息,日志中也会打印该异常信息。

if(xxx){
    
    
    throw new CustumeException(BizCodeEnum.NON_PURCHASE_ORDER);
}

对于已知异常也可以在 ControllerAdvice中直接处理,例如 JSR303字段校验异常处理,只需要在 ControllerAdvice添加如下代码:

@ExceptionHandler(MethodArgumentNotValidException.class)
    public  R handleValidException(MethodArgumentNotValidException e){
    
    
        log.error(BizCodeEnum.VALIDATE_EXCEPTION.getMessage(),e);
        BindingResult bindingResult = e.getBindingResult();
        Map<String, String> errorFieldMap = new HashMap<>();

        bindingResult.getFieldErrors().forEach(fieldError -> {
    
    
            String field = fieldError.getField();
            String defaultMessage = fieldError.getDefaultMessage();
            errorFieldMap.put(field,defaultMessage);
        });
        return R.error(BizCodeEnum.VALIDATE_EXCEPTION).put("data",errorFieldMap);
    }

猜你喜欢

转载自blog.csdn.net/baidu_40120883/article/details/132479076