@Data public class BizException extends RuntimeException {private Integer code; //业务异常码private String msg; //业务异常信息public BizException(Integer code, String message) {super(message);this.code = code;this.msg = message;}public BizException(BizExceptionEnume exceptionEnume) {super(exceptionEnume.getMsg());this.code = exceptionEnume.getCode();this.msg = exceptionEnume.getMsg();} }
2、定义一个异常枚举类
public enum BizExceptionEnume {// ORDER_xxx:订单模块相关异常// 动态扩充.....ID_NOT_NULL(10000,"ID不能为空"),PRODUCT_HAS_CLOSED(20001, "商品已下架");@Getterprivate Integer code;@Getterprivate String msg;private BizExceptionEnume(Integer code, String msg) {this.code = code;this.msg = msg;} }
3、定义全局异常处理器
@RestControllerAdvice public class GlobalExceptionHandler {/*** 如果出现了异常:本类和全局都不能处理,* SpringBoot底层对SpringMVC有兜底处理机制;自适应处理(浏览器响应页面、移动端会响应json)* 最佳实践:我们编写全局异常处理器,处理所有异常* <p>* 前端关心异常状态,后端正确业务流程。* 推荐:后端只编写正确的业务逻辑,如果出现业务问题,后端通过抛异常的方式提前中断业务逻辑。前端感知异常;* <p>* 异常处理:* 1、** @param e* @return*/@ExceptionHandler(ArithmeticException.class)public R error(ArithmeticException e) {System.out.println("【全局】 - ArithmeticException 处理");return R.error(500, e.getMessage());}//处理自定义异常@ExceptionHandler(BizException.class)public R handleBizException(BizException e) {Integer code = e.getCode();String msg = e.getMsg();return R.error(code, msg);}@ExceptionHandler(value = MethodArgumentNotValidException.class)public R methodArgumentNotValidException(MethodArgumentNotValidException ex) {//1、result 中封装了所有错误信息BindingResult result = ex.getBindingResult();List<FieldError> errors = result.getFieldErrors();Map<String, String> map = new HashMap<>();for (FieldError error : errors) {String field = error.getField();String message = error.getDefaultMessage();map.put(field, message);}return R.error(500, "参数错误", map);}// 最终的兜底@ExceptionHandler(Throwable.class)public R error(Throwable e) {System.out.println("【全局】 - Exception处理" + e.getClass());return R.error(500, e.getMessage());}
4、如果出现业务异常代码自己以抛出异常的方式写:throw new BizException(BizExceptionEnume.ID_NOT_NULL);