ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、全局异常处理器 ControllerAdvice注解的作用就是监听所有的Controller,一旦Controller抛出CustomException,就会在@ExceptionHandler(CustomException.class)对该异常进行处理。 ![](https://img.kancloud.cn/d7/a4/d7a4ee6c1db665009bacf6dd05929271_434x217.png) ~~~ @ControllerAdvice public class WebExceptionHandler { @ExceptionHandler(CustomException.class) @ResponseBody public AjaxResponse customerException(CustomException e) { if(e.getCode() == CustomExceptionType.SYSTEM_ERROR.getCode()){ //400异常不需要持久化,将异常信息以友好的方式告知用户就可以 //TODO 将500异常信息持久化处理,方便运维人员处理 } return AjaxResponse.error(e); } @ExceptionHandler(Exception.class) @ResponseBody public AjaxResponse exception(Exception e) { //TODO 将异常信息持久化处理,方便运维人员处理 //没有被程序员发现,并转换为CustomException的异常,都是其他异常或者未知异常. return AjaxResponse.error(new CustomException(CustomExceptionType.OTHER_ERROR,"未知异常")); } } ~~~ ## 二、人为制造异常测试一下 ![](https://img.kancloud.cn/22/f6/22f6548f7f36ca2927503a27f532fb26_494x202.png) ~~~ @Service public class ExceptionService { //服务层,模拟系统异常 public void systemBizError() throws CustomException { try { Class.forName("com.mysql.jdbc.xxxx.Driver"); } catch (ClassNotFoundException e) { throw new CustomException(CustomExceptionType.SYSTEM_ERROR,"在XXX业务,myBiz()方法内,出现ClassNotFoundException"); } } //服务层,模拟用户输入数据导致的校验异常 public List<String> userBizError(int input) throws CustomException { if(input < 0){ //模拟业务校验失败逻辑 throw new CustomException(CustomExceptionType.USER_INPUT_ERROR,"您输入的数据不符合业务逻辑,请确认后重新输入!"); }else{ // List<String> list = new ArrayList<>(); list.add("科比"); list.add("詹姆斯"); list.add("库里"); return list; } } } ~~~ 在HelloController里面测试 引用全局异常处理 ~~~ @Resource ExceptionService exceptionService; ~~~ 引入测试 ~~~ @RequestMapping("/ex/service") public @ResponseBody AjaxResponse system(){ exceptionService.systemBizError(); return AjaxResponse.success(); } @RequestMapping("/ex/user") public @ResponseBody AjaxResponse user(Integer input){ //请求成功返回数据 return AjaxResponse.success(exceptionService.userBizError(input)); } ~~~ 在WebExceptionHandler中error打断点 ![](https://img.kancloud.cn/e5/06/e5064f01e32dbb00fbd174187b220415_1054x311.png) 在postman中执行测试,会发现异常被捕获 ![](https://img.kancloud.cn/8f/f0/8ff0e7983cf6599828368061388fdddb_1438x704.png) 继续执行发现前端接收到异常信息 ![](https://img.kancloud.cn/ab/25/ab25a577d129652d7bba5409f9e4edc1_1219x662.png) 同理,测试有参数传递的方法也可以 ![](https://img.kancloud.cn/f4/54/f45487067467051a53390181f1366586_1414x687.png) 无异常反馈如下 ![](https://img.kancloud.cn/fc/ef/fcef6b2262dd89967848b29fbc94cd8b_988x772.png) 可以看到输入正确的值不会捕捉异常,错误的值会被捕捉异常并按照规定的方式给出