Loading... 示例代码在[https://github.com/laolunsi/spring-boot-examples](https://github.com/laolunsi/spring-boot-examples) --- ## 一、全局统一异常处理配置 先来看这样一个接口: ```java @RestController @RequestMapping(value = "") public class IndexAction { @GetMapping(value = "add") public Integer add(Integer a, Integer b) { return a+b; } } ``` 思考:调用该接口时,如果a和b中,有一个为Null,会发生什么? ![](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1575559701809.png) 网页端: ![](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1575559726072.png) 这是一个非常讨人厌的情况:调用者如何处理这种未知状况呢?通过Http请求code来判定? 不如由被调用者来处理这种问题! 通过@ControllerAdvice和@ExceptionHandler,可以自定义对全部Controller接口的异常处理机制! ```java @ControllerAdvice public class ControllerHandler { @ExceptionHandler @ResponseBody @ResponseStatus(HttpStatus.OK) public JsonResult handleException(Exception ex) { System.out.println("程序异常:" + ex.toString()); return new JsonResult(false, "请求失败"); } } ``` 重新测试: ![](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1575559748844.png) 上面我们定义了全局的异常处理,将所有异常的格式都统一了。 如果需要针对不同异常进行不同的处理呢?甚至对一个自定义的异常进行单独的处理呢?这是一个常见的请求。 --- ## 二、自定义异常类型的配置 我们定义一个UserNotExistException异常,添加测试接口: ```java @RestController @RequestMapping(value = "") public class IndexAction { @GetMapping(value = "user/{id}") public JsonResult findUser(@PathVariable Integer id) throws UserNotExistException { if (id < 100) { throw new UserNotExistException(id); } return new JsonResult(true, "暂未实现用户查询功能"); } } ``` 自定义的异常: ```java public class UserNotExistException extends Exception { private static final long serialVersionUID = -2373528888948315963L; private Integer id; public UserNotExistException(Integer id) { this.id = id; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override public String toString() { return "用户不存在"; } } ``` 未添加任何异常处理机制时,测试: ![](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1575559772508.png) 下面添加UserNotExistException异常的统一处理: ```java @ControllerAdvice public class ControllerHandler { /** * 处理全部异常 */ @ExceptionHandler @ResponseBody @ResponseStatus(HttpStatus.OK) public JsonResult handleException(Exception ex) { System.out.println("程序异常:" + ex.toString()); return new JsonResult(false, "请求失败"); } /** * 处理UserNotExistException异常 */ @ExceptionHandler({UserNotExistException.class}) @ResponseBody @ResponseStatus(HttpStatus.OK) public JsonResult handleUserNotExistException(UserNotExistException ex) { System.out.println("请求用户数据异常:" + ex.toString()); return new JsonResult(false, "请求用户数据失败"); } } ``` 测试: ![](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1575559788314.png) 再测试一下之前空指针异常: ![](http://zfh-public-blog.oss-cn-beijing.aliyuncs.com/image-1575559801973.png) 经过测试,被要求单独处理的异常会先被处理,而后其他异常会被Exception(默认形式)的处理方法捕获。 Last modification:December 5, 2019 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 0 请作者喝杯肥宅快乐水吧!