转载

SpringBoot全局统一异常处理

示例代码在 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,会发生什么?

SpringBoot全局统一异常处理

网页端:

SpringBoot全局统一异常处理

这是一个非常讨人厌的情况:调用者如何处理这种未知状况呢?通过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, "请求失败");
    }
}

重新测试:

SpringBoot全局统一异常处理

上面我们定义了全局的异常处理,将所有异常的格式都统一了。

如果需要针对不同异常进行不同的处理呢?甚至对一个自定义的异常进行单独的处理呢?这是一个常见的请求。

二、自定义异常类型的配置

我们定义一个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 "用户不存在";
    }
}

未添加任何异常处理机制时,测试:

SpringBoot全局统一异常处理

下面添加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, "请求用户数据失败");
    }

}

测试:

SpringBoot全局统一异常处理

再测试一下之前空指针异常:

SpringBoot全局统一异常处理

经过测试,被要求单独处理的异常会先被处理,而后其他异常会被Exception(默认形式)的处理方法捕获。

原文  http://www.eknown.cn/index.php/spring-boot/exception-handler.html
正文到此结束
Loading...