示例代码在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(默认形式)的处理方法捕获。
原文始发于微信公众号(猿生物语):