SpringBoot自定义全局异常处理

news2025/1/11 7:12:41

自定义全局异常处理

      • 一. 创建所需类
        • 1. 自定义异常接口
        • 2. 自定义枚举类
        • 3. 自定义异常类
        • 4. 自定义异常处理类
        • 5. 自定义全局响应类
          • 5.1 BaseResponse类
          • 5.2 RespGenerator类
      • 二. 效果演示

我们在 SpringBoot 项目中,往往会写许多 Controler 接口类,由于 Controller
类接口中传递的参数各不相同,出现错误时抛出的异常以及异常的处理方式也不尽相同。

java程序中,异常有很多种,所有异常的父类都是Throwable类,其中Exception异常是可以进行手动处理的,在程序运行过程中,也会出现各种业务异常,需要自定义,可能返回500,404,等等,前端拿到这些异常可能不方便处理,如果可以统一一个全局异常,是什么错误就返回什么信息和code码给前端,前端更便于处理。

一. 创建所需类

1. 自定义异常接口

为了代码解耦,创建一个接口类出来,定义自定义接口所需要的方法

/**
 * @author gf
 * @date 2023/2/2
 */
// 第一步:为了代码解耦,创建一个接口类出来,定义自定义接口所需要的方法
// 抽象类,提供自定义异常所需的方法
public interface BaseErrorInfoInterface {

    String getCode();

    String getMessage();
}

2. 自定义枚举类

定义一个枚举类,实现上述BaseErrorInfoInterface接口,重写上述接口的两个方法来操作这个枚举类内部的各个具体枚举值

/**
 * @author gf
 * @date 2023/2/2
 */
//第二步:定义一个枚举类,实现上述接口,重写上述接口的两个方法来操作这个枚举类内部的各个具体枚举值
public enum BaseErrorEnum implements BaseErrorInfoInterface {

    //定义异常枚举
    SUCCESS("200","成功"),
    USER_NOT_EXIST("1001","用户不存在");

    // 错误码
    private String code;
    // 错误信息提示
    private String message;

    BaseErrorEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        return message;
    }
}

后续方便管理所有错误枚举的错误信息以及code码,通过构造方法传入code值和message或者直接传入一个枚举值都行

3. 自定义异常类

自定义一个异常类,就像空指针异常类、IO流异常类一样。此处自定义的异常类属于异常类,所有肯定是要继承一个异常类的,此处需要继承RuntimeException,原因如下

RuntimeException相比Exception来讲,他是在程序运行时才会爆出异常,在编译时是不会出现异常的,这就表示,如果你throw了一个RuntimeException,不需要做额外操作;而throw一个Exception,程序会要求你try-catch,否则你根本启动不了程序,程序会提示(必须对其进行捕获或声明以便抛出)。

@Data
public class BaseException extends RuntimeException {

    // 错误码
    private String code;
    // 错误信息提示
    private String message;

    public BaseException(){
        super();
    }
    // 自定义异常构造方法
    public BaseException(BaseErrorEnum baseErrorEnum){
        super(baseErrorEnum.getCode());
        this.code=baseErrorEnum.getCode();
        this.message=baseErrorEnum.getMessage();
    }
}

4. 自定义异常处理类

/**
 - @author gf
 - @date 2023/2/2
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    // 处理自定义异常
    @ExceptionHandler({BaseException.class})
    public BaseResponse<Object> baseExceptionHandler(BaseException e) {
        log.debug("请求错误:{}", e.getMessage());
        return RespGenerator.failure(e.getCode(), e.getMessage());
    }

    // 处理空指针异常
    @ExceptionHandler({NullPointerException.class})
    public BaseResponse<Object>  exceptionHandler(NullPointerException e) {
        log.error("运行时异常:{}", e.getMessage());
        return RespGenerator.failure(BaseErrorEnum.USER_NOT_EXIST);
    }

    // 处理其他异常
    @ExceptionHandler({Exception.class})
    public BaseResponse<Object>  exceptionHandler(Exception exception) {
        log.error("未知异常:{}", exception);
        return RespGenerator.failure("500", "系统未知异常");
    }
}

注解说明:

  • @ControllerAdvice注解:结合方法型注解@ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的。
  • @ExceptionHandler注解 :统一处理某一类异常,从而能够减少代码重复率和复杂度,value值为什么异常类型,就处理什么异常类型的逻辑。

5. 自定义全局响应类

上面使用的方法返回值类BaseResponse类和RespGenerator类都是属于规范方法返回值结构体的类,也有利于一致化后端所有接口的返回结构,方便前端读取所需要的数据。

5.1 BaseResponse类

规定返回值结构

/**
 * @author gf
 * @date 2023/2/2
 */
@Data
public class BaseResponse<T> {

    private String code;

    private String messgae;

    private T Data;

    public BaseResponse() {
        super();
    }
    public BaseResponse(String code, String messgae, T data) {
        this.code = code;
        this.messgae = messgae;
        Data = data;
    }
}

5.2 RespGenerator类

将逻辑处理后的数据包装转换成BaseResponse类进行返回给前端。

/**
 * @author gf
 * @date 2023/2/2
 */
public class RespGenerator {

    // 正常返回时调用方法
    public static BaseResponse success(Object data){
        return new BaseResponse(BaseErrorEnum.SUCCESS.getCode(),"接口调用成功",data);
    }
    // 失败时调用方法
    public static  BaseResponse<Object> failure(BaseErrorEnum baseErrorEnum){
        return new BaseResponse(baseErrorEnum.getCode(),baseErrorEnum.getMessage(),null);
    }

    // 失败时调用方法(提供给GlobalExceptionHandler类使用)
    public static BaseResponse<Object> failure(String code,String message){
        return new BaseResponse(code,message,null);
    }

}

二. 效果演示

创建测试类

@RestController
public class ExceptionTest {

    @GetMapping("/test")
    public BaseResponse<String> sayHello(@RequestParam("name") String name){
        if(!name.equals("老王")){
            throw new BaseException(BaseErrorEnum.USER_NOT_EXIST);
        }
        else{
            return RespGenerator.success("调用成功");
        }
    }
}

从代码中可以看到,若name不是老王,会抛出自定义异常
在这里插入图片描述

如果姓名时老王,则返回成功

在这里插入图片描述
-----------------------------------------------------完毕----------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SNV的使用

一&#xff1a;什么是SVN&#xff1f; SVN是一个版本控制系统&#xff0c;SVN全称Subversion&#xff0c;用于记录一个或多个文件内容变化&#xff0c;方便我们查阅特定版本的修改情况。以前在没有版本控制的时候&#xff0c;我们通常在项目根目录下这样命名项目&#xff1a;p…

Python 环境搭建配置

Python可应用于多平台包括 Linux 和 Mac OS X。你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个…

微信小程序 Springboot校园达达互助平台快递代取系统 java

本 录 摘 要 III Abstract 1 1 系统概述 1 1.1 概述 2 1.2课题意义 3 1.3 主要内容 4 2 系统开发环境 5 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 2.3 JAVA简介 7 2.4 MySQL数据库 7 3 需求分析 8 3.1 系统设计目标 8 3…

STM32开发(1)----stm32f103c6t6开发板介绍和环境搭建

stm32f103c6t6开发板介绍一、stm32f103c6t6芯片资源介绍STM32 的命名规则二、最小系统开发板介绍三、开发板基本使用方法软件安装MDK5 安装安装STM32芯片包安装licenseUSB转串口驱动安装四、本文小结一、stm32f103c6t6芯片资源介绍 stm32f103c6t6 是一款基于 ARM Cortex M3 内…

测试岗外包4年终上岸,这段日子说起来都是泪啊

昨天一个老哥找到我倾诉&#xff0c;他干了好几年外包&#xff0c;现在通过自己的努力应聘上了阿里测试开发&#xff0c;虽然只是P6&#xff0c;但也属实不容易了。这位老哥是湖南长沙毕业的&#xff0c;计算机专业&#xff0c;二流本科。长沙&#xff0c;湖南省会&#xff0c;…

Python图像合成与视频倒放

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、视频抓帧二、图像转换1&#xff0c;图像翻转2&#xff0c;图像文件倒序三、倒序视频合成四、图像截取拓展任务——动态图合成与倒放1&#xff0c;gif动态图生…

面了个阿里拿28k跳槽出来的,真正见识到了跳槽天花板

2022年已经结束了&#xff0c;迎来的是2023崭新的一年&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备金三银四的面试计划。 作为一个入职5年的老人家&#xff0c;目前工资比较乐观&#xff0c;但是我还是会选择跳槽&#xff0c;因为感觉…

MySQL表中的联合查询

上一篇有关聚合查询的博客:MySQL表中的聚合查询_徐憨憨&#xff01;的博客-CSDN博客主要是针对单个表进行查询操作,但是实际的开发环境中,数据往往来自己于不同的数据表,此时就需要使用联合查询进行操作!联合查询多表查询的基本执行过程:进行笛卡尔积然后设置条件删除无效数据进…

Echarts环形图线性渐变,hover后显示阴影

第004个点击查看专栏目录Echarts的渐变在上一篇文章中已经讲过 ECharts线性渐变色示例演示&#xff08;2种渐变方式&#xff09;&#xff0c;这里做了环形图&#xff0c;饼图的一个渐变示例演示&#xff0c;hover到元素后&#xff0c;会呈现出一个阴影。注意&#xff0c;颜色属…

年度总结 | 积跬步以至千里,2023一起筑梦新征程

2022年&#xff0c;是值得载入史册的一年。疫情开放&#xff0c;健康码隐入历史尘埃。国际形势紧张&#xff0c;信创化进入快车道。企业加速转型&#xff0c;跨界技术融合的运维新生态已初露苗头。回顾2022&#xff0c;我们聚沙成塔逆寒流而勇进&#xff0c;精造创新以实践诠释…

【Linux】基础网络编程

计算机网络基本概念 在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 计算机网络的分类与一般的事物分类方法一样&#xff0c;可以按事物所具有的不同性质特点分类。计算机网络通俗地讲就是由多台计算…

VMware双网卡配置(ubuntu)

桥接的时候不能上网&#xff0c;上网的时候又不能桥接和开发板通信&#xff0c;这是一个非常难受的事情&#xff0c;下面我来配置一下双网卡&#xff0c;一个用来桥接和单片机通信&#xff0c;一个用来上网。 ⚫ NAT 网卡&#xff1a;Ubuntu 通过它上网&#xff0c;只要 Windo…

【快速开始】vuejs环境搭建第一个项目

本篇包含vuejs环境安装以及通过vue客户端快速创建运行第一个项目。(注&#xff1a;以下内容均已windows平台为基准) 目录&#xff1a; 一、安装nodejs 二、配置国内源加速 三、安装vue客户端 四、创建第一个应用 1、安装nodejs&#xff1a; 1.1、下载 官网下载地址&…

【Java】java | smart-doc + tonar | API文档统一管理

一、说明 1、准备舍弃swagger了&#xff0c;拥抱smart-doc 2、win10 3、jdk8 4、idea 二、搭建torna 1&#xff09;下载zip https://foruda.gitee.com/attach_file/1672544760054905357/torna-1.19.4.zip?token25e02a8e2817a757a0aa47172349cc20&ts1675345098&am…

06 Sentinel规则持久化(3)

Sentinel 持久化模式 Sentinel规则的推送有下面三种模式: 1、原始模式 如果不做任何修改&#xff0c;Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中&#xff1a; 这种做法的好处是简单&#xff0c;无依赖&#xff1b;坏处是应用重启规则就会消失…

智能网联汽车信息安全敲响「警钟」,如何筑牢防线?

2009年起&#xff0c;谷歌、百度等互联网科技公司就入局自动驾驶&#xff0c;旨在赋予汽车更智慧的大脑。 如今&#xff0c;物流、港口等场景下自动驾驶的商业化落地&#xff0c;众多的网联化接口不仅加强了智能网联汽车与操作环境之间的紧密关联&#xff0c;也促使智能网联汽…

Linux 学习笔记 文件、目录操作与用户群组权限

一、命令行提示符 1.1 命令行基础 bearpi&#xff1a;当前用户名&#xff0c;在前是用户名 ubuntu&#xff1a;用户所在的域名&#xff0c;在后面&#xff0c;这是我自定义的&#xff0c;默认应该是主机名 ~ 波浪线为目前所在目录&#xff0c;~代表家目录&#xff08;home d…

【LMI传感器】LMI Gocator线激光传感器环境变量配置

文章目录1 打开系统环境配置界面2 环境变量配置1 打开系统环境配置界面 控制面板>系统和安全>系统>高级系统设置 系统属性>高级>环境变量 2 环境变量配置 环境变量配置 GENICAM_GENTL32_PATH E:\Program Files(x86)\GoCator\Release_5.3.22.22(SR1)\Integ…

ios pod更换三方库source

无法访问github&#xff0c;pod无法添加三方库&#xff0c;此时gitlab上有这个三方库并且可以访问。以FMDB为例子本地路径&#xff1a;/Users/用户名/.cocoapods/repos/trunk/Specs/f/4/e/FMDB/2.7.5修改podspec.json内sourcegithubgitlab"source": { "git"…

Pipenv:作为 Python 开发人员为什么应该使用它

Pipenv 是一个旨在将所有打包世界中最好的东西带到 Python 世界的工具。它将 Pipfile、pip 和 virtualenv 整合到一个命令中。它会自动为您的项目创建和管理虚拟环境&#xff0c;并在您安装/卸载包时从您的 Pipfile 添加/删除包。在深入研究之前&#xff0c;让我们先看看 Pipen…