示例代码在 https://github.com/laolunsi/spring-boot-examples
先来看这样一个接口:
@RestController @RequestMapping(value = "") public class IndexAction { @GetMapping(value = "add") public Integer add(Integer a, Integer b) { return a+b; } }
思考:调用该接口时,如果a和b中,有一个为Null,会发生什么?
网页端:
这是一个非常讨人厌的情况:调用者如何处理这种未知状况呢?通过Http请求code来判定?
不如由被调用者来处理这种问题!
通过@ControllerAdvice和@ExceptionHandler,可以自定义对全部Controller接口的异常处理机制!
@ControllerAdvice public class ControllerHandler { @ExceptionHandler @ResponseBody @ResponseStatus(HttpStatus.OK) public JsonResult handleException(Exception ex) { System.out.println("程序异常:" + ex.toString()); return new JsonResult(false, "请求失败"); } }
重新测试:
上面我们定义了全局的异常处理,将所有异常的格式都统一了。
如果需要针对不同异常进行不同的处理呢?甚至对一个自定义的异常进行单独的处理呢?这是一个常见的请求。
我们定义一个UserNotExistException异常,添加测试接口:
@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, "暂未实现用户查询功能"); } }
自定义的异常:
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 "用户不存在"; } }
未添加任何异常处理机制时,测试:
下面添加UserNotExistException异常的统一处理:
@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, "请求用户数据失败"); } }
测试:
再测试一下之前空指针异常:
经过测试,被要求单独处理的异常会先被处理,而后其他异常会被Exception(默认形式)的处理方法捕获。