springboot全局异常处理方式

 更新时间:2025年11月27日 09:54:01   作者:q***4718  
文章介绍了Spring Boot中处理异常的两种方式,还详细解释了@ControllerAdvice和@ExceptionHandler注解的用法,并通过一个示例展示了全局异常处理的效果,感兴趣的朋友跟随小编一起看看吧

一、springboot中处理异常的方式?

1、try…catch处理异常

如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在其他方法中加上try…catch进行处理,代码冗余,不通用。

  • 代码可读性:业务逻辑代码中混入大量的异常处理代码会降低代码的可读性,使得主要业务逻辑变得难以理解和维护。
  • 代码可维护性:如果在每个可能抛出异常的地方都使用try...catch,将使得代码变得冗长和复杂,增加维护成本。
  • 异常的传播:异常的目的是传递错误信息,如果每个地方都捕获并处理异常,可能会隐藏错误的根本原因,使得问题难以被发现和解决。

2、全局异常处理器

Spring Boot的全局异常处理是通过@ControllerAdvice@RestControllerAdvice注解的类来实现的。这些类可以捕获和处理应用程序中的异常,并返回统一的错误响应。

二、为什么需要全局异常处理?

  • 统一错误响应:**全局异常处理允许你定义一个统一的错误响应格式,这样无论在应用程序的哪个部分发生异常,都能返回一致的错误信息。**这有助于前端开发者更好地处理错误,提升用户体验。
  • 避免代码重复:如果没有全局异常处理,你可能需要在每个控制器或服务中重复编写异常处理代码。全局异常处理机制可以集中处理异常,减少代码重复,提高代码的可维护性。
  • 增强可维护性:集中管理异常处理逻辑使得代码更加模块化,易于维护和更新。当需要修改错误处理逻辑时,你只需要在一个地方进行修改,而不需要逐个修改每个控制器或服务。
  • 提高系统的健壮性:全局异常处理可以捕获并处理那些在应用程序运行过程中可能未被预期到的异常。这有助于避免应用程序因未处理的异常而崩溃,增强了系统的健壮性。
  • 日志记录和监控:全局异常处理通常伴随着日志记录,这有助于开发者在开发和生产环境中监控和诊断问题。通过记录详细的错误信息和堆栈跟踪,可以快速定位问题并进行修复。
  • 安全性”通过全局异常处理,可以避免将敏感的系统信息(如内部错误代码或堆栈跟踪)暴露给用户。你可以自定义错误信息,只向用户显示必要的错误详情,从而提高系统的安全性。
  • 符合RESTful API设计原则:在RESTful API设计中,使用HTTP状态码来表示不同的错误类型是一种常见的做法。全局异常处理可以帮助你根据异常类型自动设置合适的HTTP状态码,符合RESTful API的设计原则。
  • 减少客户端处理复杂性:当客户端(如移动应用或前端应用)调用后端服务时,全局异常处理可以确保返回一个清晰、一致的错误格式。这使得客户端开发者更容易理解和处理这些错误,减少客户端代码的复杂性。

三、全局异常处理实现

全局异常处理类

package com.example.demo.exception;
import com.example.demo.response.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalException {
    @ExceptionHandler(value = {Exception.class})
    public Result<String> ex(Exception e)
    {
        return Result.error(e.getMessage());
    }
}

controller类

    @GetMapping("test")
    public int test(){
        List<Integer> integers = new ArrayList<>();
        for (int i = 0; i < 10; i++){
            integers.add(i);
        }
        //故意数组过界
        for (int i = 0; i < 20; i++){
            System.out.println(integers.get(i));
        }
        return 1;
    }

result结果类

package com.example.demo.response;
import lombok.Data;
@Data
public class Result<T> {
    private int code;
    private String msg;
    private T data;
    public Result() {
    }
    public Result(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public static Result<String> error(String message) {
        return new Result(500, message, null);
    }
}

四、测试

我下面使用到的工具是apifox,当然你也可以直接使用postman或者浏览器测试。

启动springboot项目

使用apifox发送请求,请求结果如下所示:

这个地方我们就可以发现实际上就是自动的帮我们做了异常处理了,当然我给的这个实例只是针对于全部的异常而不是自定义的异常。

五、@ControllerAdvice详解

@ControllerAdvice 是 Spring MVC 提供的一个注解,用于定义一个类作为全局异常处理器。使用这个注解的类可以捕获和处理来自 Spring MVC 控制器的异常。

以下是 @ControllerAdvice 注解的一些关键点:

  • 作用域:通常用于处理@Controller@RestController中抛出的异常。
  • 方法:在类中定义的方法可以使用@ExceptionHandler注解来指定处理特定类型的异常。
  • 返回类型:处理方法通常返回ModelAndViewResponseEntity对象,以便控制视图和响应状态。

当然@ControllerAdvice也是可以设置参数的,可以设置不是作用于全部的controller下,具体实例如下所示:

@RestControllerAdvice(annotations = {RestController.class})
???????@ControllerAdvice(annotations = {RestController.class, Controller.class})

六、@ExceptionHandler 详解

1.用法:

  • @ExceptionHandler 注解可以用于方法级别,用于标记一个方法为异常处理方法。
  • 异常处理方法需要定义在控制器类中,并且可以有任意的访问修饰符。

2.参数:

  • 异常处理方法的参数可以是异常类型,也可以是其他类型的参数。
  • 如果异常处理方法的参数是异常类型,则该方法只会处理指定类型的异常。
  • 如果异常处理方法的参数是其他类型的参数,则该方法会处理所有类型的异常,并且异常对象会作为参数传递给方法。

3.异常处理逻辑:

  • 异常处理方法可以编写任意的异常处理逻辑,比如记录日志、返回错误信息、执行特定的补救措施等。
  • 在方法中可以通过异常对象来获取异常信息,如异常消息、堆栈轨迹等。

4.多个异常处理方法:

  • 一个控制器类可以有多个异常处理方法,用来处理不同类型的异常。
  • 当多个异常处理方法都能处理同一类型的异常时,Spring 框架会选择最匹配的异常处理方法来处理异常。

到此这篇关于springboot全局异常处理方式的文章就介绍到这了,更多相关springboot全局异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决spring cloud zuul与nginx的域名转发问题

    解决spring cloud zuul与nginx的域名转发问题

    这篇文章主要介绍了spring cloud zuul与nginx的域名转发问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 详解Java的位操作符

    详解Java的位操作符

    位操作就是对这些数据进行基本的操作。如果基本类型是char、byte或者short类型的数值进行移位处理,那么会转化成int类型,再进行移位的处理
    2017-09-09
  • 深入理解Java并发编程之ThreadLocal

    深入理解Java并发编程之ThreadLocal

    本文主要介绍了Java并发编程之ThreadLocal,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤

    基于Java配置选项,可以编写大多数的Spring不用配置XML,下面这篇文章主要给大家介绍了关于在Spring中基于Java类进行配置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • SpringBoot启用GZIP压缩的代码工程

    SpringBoot启用GZIP压缩的代码工程

    经常我们都会与服务端进行大数据量的文本传输,例如 JSON 就是常见的一种格式,通过 REST API 接口进行 GET 和 POST 请求,可能会有大量的文本格式数据提交、返回,压缩和解压在提升网络带宽的同时,会带来 CPU 资源的损耗,本文介绍了SpringBoot启用GZIP压缩的代码工程
    2024-08-08
  • Java多线程案例之定时器详解

    Java多线程案例之定时器详解

    定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码。本文就来和大家详细聊聊定时器的原理与使用,感兴趣的可以了解一下
    2022-10-10
  • SpringMVC RESTFul实战案例删除功能实现

    SpringMVC RESTFul实战案例删除功能实现

    这篇文章主要为大家介绍了SpringMVC RESTFul实战案例删除功能实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java代码中4种字符串拼接方式分析

    Java代码中4种字符串拼接方式分析

    本文主要介绍了Java代码中4种字符串拼接方式分析,主要介绍了“+”号、StringBuilder、StringJoiner、String#join,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java mybatis框架配置详解

    java mybatis框架配置详解

    在本篇文章里小编给大家整理的是一篇关于java mybatis框架配置详解内容,对此有兴趣的朋友们可以参考下。
    2021-02-02
  • CentOS 7.9服务器Java部署环境配置的过程详解

    CentOS 7.9服务器Java部署环境配置的过程详解

    这篇文章主要介绍了CentOS 7.9服务器Java部署环境配置,主要包括ftp服务器搭建过程、jdk安装方法以及mysql安装过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论