当前位置: 首页 > news >正文

【企业标准开发框架 01】全局异常处理+自定义异常类

【企业标准开发框架 01】全局异常处理+自定义异常类

是什么?

【0】 全局异常处理器(统一拦截所有的Controller抛出的异常)

  • 统一拦截异常的机制,保证所有的Controller抛出的异常都可以被捕获,并且标准化的形式返回响应
  • 在Spring Boot中通常使用RestControllerAdvice + @ExceptionHandler 来实现

【1】自定义异常类(业务异常类)

  • 自定义业务的异常类,用来明确表示业务的错误(如:用户不存在,余额不足)
  • 通常包含错误码+错误原因,便于前后端协同

为什么?

为什么必须要这样做,上面已经赘述过了,就是放了方便前后端联调,方便知道是哪里的业务出现了问题!

优点:

  1. 统一性(如果不写比较混乱,前端无法统一处理,写了之后都是{code,message,data} )
  2. 安全性 (如果不写有可能会把内部堆栈、sql信息泄露给用户)
  3. 可维护性(方便定义问题,能够快速知道是哪个模块出现的错误,前端也可以根据错误码给出提示)

怎么做?

步骤
1.自定义业务异常类(BusinessException)
2. 定义枚举类(ErrorCodeEnum)
3. 全局异常处理类(GlobalExceptionHandler)
4. 业务中直接使用throw new BusinessException(…)

自定义业务异常类

01. 枚举类
import lombok.Data;
import lombok.Generated;
import lombok.Getter;public enum CodeEnum {// 通用SUCCESS(0, "成功"),SYSTEM_ERROR(1000, "系统异常"),PARAM_ERROR(1001, "参数错误"),UNAUTHORIZED(1002, "未认证或登录已过期"),FORBIDDEN(1003, "没有权限"),// 用户模块USER_NOT_FOUND(2001, "用户不存在"),USERNAME_EXISTS(2002, "用户名已存在"),PASSWORD_ERROR(2003, "密码错误");private final int code;private final String message;CodeEnum(int code, String message) {this.code = code;this.message = message;}public int getCode(){return code;}public String getMessage(){return message;}
}
02.自定义异常类
/*** @author Soft* @version 1.0* @description: 自定义异常处理类* @date 2025/8/22 11:44*/
public class BusinessException extends RuntimeException {private final int code;/** * @author bohai* @description: 通过枚举构造 * @param:  * @return: * @date: 2025/8/22 15:32*/ public BusinessException(CodeEnum codeEnum){super(codeEnum.getMessage());this.code = codeEnum.getCode();}/**0. 在后续的业务中直接使用就可以throw new BusinessException(CodeEnum.USER_NOT_FOUND);1. 为什么code使用了final?但是message却没有使用final原因一:首先RuntimeException继承的是Exception,而Exception又继承Throwable,它里面的message是已经定义好的,而且是没有使用final的!!原因二:是因为实际开发中通常也不会修改message,但是又拼接的情况,方便重写message和灵活高效的调试,*/// 直接传入错误码和信息public BusinessException(int code, String message) {super(message);this.code = code;}public int getCode() {return code;}
}

为什么message不使用final? 上述代码注释中有详细解释!

在这里插入图片描述

03. 统一返回体

/*** @author hai* @version 1.0* @description: 统一返回体* @date 2025/8/22 15:55*/
@Data
public class AjaxResponse<T> extends HashMap<String, Object
http://www.dtcms.com/a/347968.html

相关文章:

  • JAVA限流方法
  • System.IO.Pipelines 与“零拷贝”:在 .NET 打造高吞吐二进制 RPC
  • 【SpringBoot集成篇】SpringBoot 深度集成 Elasticsearch 搜索引擎指南
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十五)网格布局
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十三)菜单、右键菜单
  • 【JavaEE】了解synchronized
  • 大数据毕业设计选题推荐-基于大数据的丙型肝炎患者数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 【数据结构】从基础到实战:全面解析归并排序与计数排序
  • 基于stm32汽车雨刮器控制系统设计
  • Java基础第3天总结(面向对象)
  • Shell Case 条件语句详解
  • EP01:【DA】数据分析的概述
  • 01Shell脚本入门:基础命令与变量解析
  • JVM之【类加载系统】
  • 【Qt开发】常用控件(六)
  • Golang云端编程深度指南:架构本质与高阶实践
  • Flink Slot 不足导致任务Pending修复方案
  • 互联网大厂Java面试实录:从Spring到微服务的全面考察
  • 【软件安全】ARM64、x86、32 位与 64 位架构的区别、定义、应用背景
  • 个人搭建小网站教程(云服务器Ubuntu版本)
  • 【数据结构】二叉树的顺序存储、堆的实现及其应用:堆排序与Top-K问题
  • 以国产IoTDB为代表的主流时序数据库架构与性能深度选型评测
  • kanass V1.1.4版本发布,支持Mysql数据库、ubuntu安装与Mantis数据导入
  • Thonny+MicroPython搭建ESP32芯片开发环境
  • 代码性能测试——benchmark库
  • Elasticsearch Ruby 客户端故障排查实战指南
  • AI与SEO关键词协同优化
  • DBeaver连接SQL Server集成认证问题解决方案
  • xxl-job 启动后导致pod内存使用率持续增加
  • 从 Unity UGUI 到 Unreal UMG 的交互与高效实践:UI 事件、坐标系适配与性能优化