SpringBoot全局异常处理配置

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 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(默认形式)的处理方法捕获。

原文始发于微信公众号(猿生物语):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SpringBoot全局异常处理配置


 上一篇
SpringBoot接收时间类型参数完整解决方案 SpringBoot接收时间类型参数完整解决方案
在JavaWeb程序的开发过程中,接口是前后端对接的主要窗口,而接口参数的接收有时候是一个令人头疼的事情,这其中最困扰程序猿的,应该是时间参数的接收。 比如:设置一个用户的过期时间,前端到底以什么格式传递参数呢?时间戳?还是2019-12-
下一篇 
SpringBoot日志处理之Logback SpringBoot日志处理之Logback
日志处理是一个正式项目必备的功能,日志要能够根据时间、类型等要素,根据指定格式来保存指定的日志,方便我们观察程序运行情况、定位程序bug。 SpringBoot中推荐使用Logback日志框架。 本节示例项目在https://github.