千家信息网

SpringBoot全局异常处理的使用方法

发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,本篇内容主要讲解"SpringBoot全局异常处理的使用方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot全局异常处理的使用方法"吧!
千家信息网最后更新 2025年12月04日SpringBoot全局异常处理的使用方法

本篇内容主要讲解"SpringBoot全局异常处理的使用方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"SpringBoot全局异常处理的使用方法"吧!

I. 环境搭建

首先得搭建一个 web 应用才有可能继续后续的测试,借助 SpringBoot 搭建一个 web 应用属于比较简单的活;

创建一个 maven 项目,pom 文件如下

    org.springframework.boot    spring-boot-starter-parent    2.1.7         UTF-8    UTF-8    Finchley.RELEASE    1.8            org.springframework.boot        spring-boot-starter-web                com.alibaba        fastjson        1.2.45                                            org.springframework.boot                spring-boot-maven-plugin                                    spring-milestones        Spring Milestones        https://repo.spring.io/milestone                    false            

依然是一般的流程,pom 依赖搞定之后,写一个程序入口

/** * Created by @author yihui in 15:26 19/9/13. */@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class);    }}

II. 异常处理

1. @ControllerAdvice

我们通常利用@ControllerAdvice配合注解@ExceptionHandler来实现全局异常捕获处理

  • @ControllerAdvice为所有的 Controller 织入增强方法

  • @ExceptionHandler标记在方法上,表示当出现对应的异常抛出到上层时(即没有被业务捕获),这个方法会被触发

下面我们通过实例进行功能演示

a. 异常捕获

我们定义两个异常捕获的 case,一个是除 0,一个是数组越界异常

@Slf4j@ControllerAdvicepublic class GlobalExceptionHandler {    public static String getThrowableStackInfo(Throwable e) {        ByteArrayOutputStream buf = new ByteArrayOutputStream();        e.printStackTrace(new java.io.PrintWriter(buf, true));        String msg = buf.toString();        try {            buf.close();        } catch (Exception t) {            return e.getMessage();        }        return msg;    }    @ResponseBody    @ExceptionHandler(value = ArithmeticException.class)    public String handleArithmetic(HttpServletRequest request, HttpServletResponse response, ArithmeticException e)            throws IOException {        log.info("divide error!");        return "divide 0: " + getThrowableStackInfo(e);    }    @ResponseBody    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)    public String handleArrayIndexOutBounds(HttpServletRequest request, HttpServletResponse response,            ArrayIndexOutOfBoundsException e) throws IOException {        log.info("array index out error!");        return "aryIndexOutOfBounds: " + getThrowableStackInfo(e);    }}

在上面的测试中,我们将异常堆栈返回调用方

b. 示例服务

增加几个测试方法

@Controller@RequestMapping(path = "page")public class ErrorPageRest {    @ResponseBody    @GetMapping(path = "divide")    public int divide(int sub) {        return 1000 / sub;    }    private int[] ans = new int[]{1, 2, 3, 4};    @ResponseBody    @GetMapping(path = "ary")    public int ary(int index) {        return ans[index];    }}
c. 测试说明

实例测试如下,上面我们声明捕获的两种异常被拦截并输出对应的堆栈信息;

但是需要注意

  • 404 和未捕获的 500 异常则显示的 SpringBoot 默认的错误页面;

  • 此外我们捕获返回的 http 状态码是 200

2. @ResponseStatus

上面的 case 中捕获的异常返回的状态码是 200,但是在某些 case 中,可能更希望返回更合适的 http 状态码,此时可以使用ResponseStatus来指定

使用方式比较简单,加一个注解即可

@ResponseBody@ExceptionHandler(value = ArithmeticException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public String handleArithmetic(HttpServletRequest request, HttpServletResponse response, ArithmeticException e)        throws IOException {    log.info("divide error!");    return "divide 0: " + getThrowableStackInfo(e);}

3. 404 处理

通过@ControllerAdvice配合@ExceptionHandler可以拦截 500 异常,如果我希望 404 异常也可以拦截,可以如何处理?

首先修改配置文件application.properties,将NoHandlerFoundException抛出来

# 出现错误时, 直接抛出异常spring.mvc.throw-exception-if-no-handler-found=true# 设置静态资源映射访问路径,下面两个二选一,spring.mvc.static-path-pattern=/statics/**# spring.resources.add-mappings=false

其次是定义异常捕获

@ResponseBody@ExceptionHandler(value = NoHandlerFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public String handleNoHandlerError(NoHandlerFoundException e, HttpServletResponse response) {    return "noHandlerFound: " + getThrowableStackInfo(e);}

再次测试如下,404 被我们捕获并返回堆栈信息

到此,相信大家对"SpringBoot全局异常处理的使用方法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0