3.全局统一异常处理
3.1目前存在问题
-
模拟后台出现服务器异常
@GetMappingpublic ResultResp list(@RequestParam(required = false) String name){System.out.println(1/0);List<Item> ret = service.lists(name);return ResultResp.success(ret==null?Code.PAGE_FAIL:Code.PAGE_OK,ret);}
-
出现如下错误
3.2后端服务可能会出现的异常
-
框架可能报错
-
持久层代码报错
-
业务层业务代码报错
-
控制层业务代码报错
-
注意:这些异常不能避免的,此时应该把所有的异常在表现层进行统一的处理(aop)
-
解决方案
@RestControllerAdvice public class ExceptionHandlerController {@ExceptionHandler(ArithmeticException.class)public ResultResp handlerException(){System.out.println("出现异常了");return new ResultResp(500,null,"服务繁忙,请稍后再试");} }
3.3@RestControllerAdvice
-
使用来做控制器增强操作
名称 @RestControllerAdvice 位置 Rest 风格增强类上 作用 给控制器做增强操作 使用 类上面 - 包含了如下注解
- @ResponseBody
- @ControllerAdvice
- @Component
- 包含了如下注解
3.4@ExceptionHandler
-
异常处理器
名称 @ExceptionHandler 位置 方法上 属性 具体的异常类型 作用 处理具体异常的,设定具体异常类型,出现异常后,终止controller中方法的执行,转入当前方法执行
3.5项目中具体处理
-
业务异常
@Data public class BusinessException extends RuntimeException{private Integer code; }
-
持久层异常
@Data public class DaoException extends RuntimeException{private Integer code; }
-
系统异常
@Data public class SystemException extends RuntimeException{private Integer code; }
-
其它异常
@Data public class OtherException extends RuntimeException{private Integer code; }
-
定义code
public class Code {/*** 定义好协议之后,前端和后端统一按照协议执行*/public static final Integer SAVE_OK = 20000;public static final Integer SAVE_FAIL = 20001;public static final Integer UPDATE_OK = 20010;public static final Integer UPDATE_FAIL = 20011;public static final Integer DELETE_OK = 20020;public static final Integer DELETE_FAIL = 20021;public static final Integer GET_OK = 20030;public static final Integer GET_FAIL = 20031;public static final Integer PAGE_OK = 20040;public static final Integer PAGE_FAIL = 20041;public static final Integer BUSINESS_ERR = 50001;public static final Integer SYSTEM_ERR = 50002;public static final Integer DAO_ERR = 50003;public static final Integer OTHER_ERR = 50005;}
-
统一异常处理
@RestControllerAdvice public class ExceptionHandlerController {//业务异常的例子:账户名和密码错误@ExceptionHandler(BusinessException.class)public ResultResp handlerBusinessException(BusinessException e){return new ResultResp(e.getCode(),null,e.getMessage());}//需要发送短信提醒运维人员@ExceptionHandler(SystemException.class)public ResultResp handlerSystemException(SystemException e){//发送短信提醒业务人员的操作//日志打印return new ResultResp(e.getCode(),null,e.getMessage());}@ExceptionHandler(OtherException.class)public ResultResp handlerException(OtherException e){return new ResultResp(e.getCode(),null,e.getMessage());} }
-
控制层方法
@GetMapping public ResultResp list(@RequestParam(required = false) String name) {if (name == null || name.equals(""))throw new BusinessException(Code.BUSINESS_ERR,"传参不正常请重试");List<Item> ret = null;try {ret = service.lists(name);} catch (Exception e) {throw new SystemException(Code.SYSTEM_ERR,"系统繁忙,请稍后再试");}return ResultResp.success(ret == null ? Code.PAGE_FAIL : Code.PAGE_OK, ret); }