SpringBoot 全局异常处理


文章目录

  • 第5章:SpringBoot 全局异常处理
    • SpringBoot全局异常介绍

第5章:SpringBoot 全局异常处理

SpringBoot全局异常介绍

什么是全局异常处理?

  • 集中捕获项目中所有未被手动捕获的异常;
  • 统一封装成前端可解析的 JSON 格式(如包含错误码、错误信息);
  • 替代默认的杂乱错误页面 / 堆栈信息。

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

  • 格式统一:

    • 所有异常返回相同结构(如{code: 500, msg: "服务器内部错误", data: null}
    • 前端无需适配多种错误格式。
  • 隐藏细节:

    • 避免直接返回堆栈信息(含代码路径等敏感信息)
    • 提升安全性。
  • 减少冗余:

    • 无需在每个 Controller 方法中重复编写try-catch
    • 简化代码。
  • 便于调试:

    • 可在异常处理器中统一记录日志
    • 快速定位问题。

@ControllerAdvice

  • 标识一个 “全局增强类”
  • 作用于所有@Controller标注的类
  • 可用于全局异常处理、全局数据绑定等。

@ExceptionHandler

  • 标注在方法上
  • 指定该方法处理哪种类型的异常
  • @ExceptionHandler(NullPointerException.class)处理空指针异常

实现流程

  • 当 Controller 方法抛出异常且未手动捕获时,异常会被 Spring 框架捕获。
  • Spring 会查找标注了@ControllerAdvice的类中
  • 是否有@ExceptionHandler标注的、匹配该异常类型的方法。
  • 找到匹配的方法后,执行该方法
  • 将返回值(统一响应格式)返回给前端。
  1. 定义统一响应结果类(Result)

    packagecom.guslegend.common;importlombok.Data;@DatapublicclassResult<T>{// 状态码privateIntegercode;// 错误信息privateStringmsg;// 响应数据privateTdata;// 成功响应(带数据)publicstatic<T>Result<T>success(Tdata){Result<T>result=newResult<>();result.setCode(200);result.setMsg("success");result.setData(data);returnresult;}// 成功响应(无数据)publicstatic<T>Result<T>success(){returnsuccess(null);}// 错误响应publicstatic<T>Result<T>error(Integercode,Stringmsg){Result<T>result=newResult<>();result.setCode(code);result.setMsg(msg);result.setData(null);returnresult;}}
  2. 定义自定义业务异常

    packagecom.guslegend.exception;publicclassBusinessExceptionextendsRuntimeException{// 错误码privateIntegercode;// 构造方法:传入错误码和错误信息publicBusinessException(Integercode,Stringmessage){super(message);this.code=code;}// getterpublicIntegergetCode(){returncode;}}
  3. 实现全局异常处理器(GlobalExceptionHandler)

    packagecom.guslegend.exception;importcom.guslegend.common.Result;importlombok.extern.slf4j.Slf4j;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice@Slf4jpublicclassGlobalExceptionHandler{/** * 处理自定义业务异常(优先级最高,先捕获业务异常) */@ExceptionHandler(BusinessException.class)@ResponseBody// 返回JSON格式publicResult<Void>handleBusinessException(BusinessExceptione){log.error("业务异常:{}",e.getMessage());returnResult.error(e.getCode(),e.getMessage());}/** * 处理系统异常(如空指针、数据库异常等,作为兜底处理) */@ExceptionHandler(Exception.class)@ResponseBodypublicResult<Void>handleSystemException(Exceptione){log.error("系统异常:",e);returnResult.error(500,"服务器内部错误,请联系管理员");}}
  4. 在业务中使用异常处理

    @GetMapping("/error/{id}")publicResult<String>getUser(@PathVariableLongid){if(id==0){thrownewBusinessException(404,"用户不存在");}// 正常返回returnResult.success("用户信息:"+id);}

查看测试结果


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

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

相关文章

【顶刊未发表】基于混沌增强领导者黏菌算法CELSMA复杂山地危险模型无人机路径规划附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

计算机小程序毕设实战-基于springboot+微信小程序的服装商城的设计与实现小程序基于微信小程序的在线服装商城店铺的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

提示工程架构师带你领略Agentic AI提示工程自我学习能力的灵活性

Agentic AI提示工程&#xff1a;让你的Prompt学会“自我进化”的灵活之道 引言&#xff1a;传统提示工程的“静态困境”与Agentic AI的破局 你是否遇到过这样的困扰&#xff1f; 精心设计的Prompt在面对多样化的用户问题时&#xff0c;常常“水土不服”——比如针对普通用户的…

Python+Vue的 第三方物流管理系统 django Pycharm flask

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 …

STM32F03C8T6通过AT指令获取天气API-下篇

这里写目录标题堆栈大小换算与修改说明一、十六进制到十进制的换算1.1 换算公式1.2 换算结果二、修改前后的对比修改前&#xff08;原始配置&#xff09;&#xff1a;修改后&#xff08;新配置&#xff09;&#xff1a;三、STM32F103C8T6的内存限制四、为什么需要调整堆栈大小&…

2024最新大数据架构趋势:云原生与湖仓一体实战指南

2024大数据架构趋势深度解析&#xff1a;云原生与湖仓一体实战指南 一、引言&#xff1a;为什么说“云原生湖仓一体”是2024大数据的“必选项”&#xff1f; 1.1 一个真实的痛点&#xff1a;企业数据架构的“两难困境” 某零售企业的技术负责人最近很头疼&#xff1a; 数据分散…

小程序毕设选题推荐:基于微信小程序的网上服装商城系统基于springboot+微信小程序的服装商城的设计与实现小程序【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

RAG vs 微调:LLM优化双路径指南 + LLaMA-Factory Online高效落地

RAG vs 微调:LLM优化双路径指南 + LLaMA-Factory Online高效落地在大型语言模型(LLM)应用中,RAG(检索增强生成) 与 微调(Fine-Tuning) 是适配特定任务的两大核心优化方案。而LLaMA-Factory Online作为一站式…

RoMa v2 - MKT

RoMa v2 特别地,航空数据集AerialMD [45]和BlendedMVS [49]的包含,使我们提出的模型对大旋转和空对地视点变化显著更加鲁棒。小基线数据集的包含,如FlyingThings3D [26],使RoMa v2在预测精细细节方面显著更好。我…

小程序计算机毕设之基于springboot+微信小程序的服装购物平台的设计与实现小程序(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

吐血推荐10个一键生成论文工具,专科生毕业论文必备!

吐血推荐10个一键生成论文工具&#xff0c;专科生毕业论文必备&#xff01; 专科生的论文救星&#xff0c;AI 工具如何改变你的写作方式&#xff1f; 在如今的学术环境中&#xff0c;论文写作早已不再是单纯的文字堆砌&#xff0c;而是对逻辑、结构和内容深度的综合考验。尤其是…

AArch64和X86下的函数调用 - Polaris

AArch64和X86下的函数调用 最近在研究llvm-bolt的indirect-call-promotion优化,借着这个机会一并总结下函数调用的概念以及底层的一些相关实现,鉴于知识局限性,部分细节描述可能不到位,欢迎纠正。 函数调用在 CPU层…

MCU单总线通信

文章目录 一、核心原理详解 1. 整体硬件原理 (1)硬件架构核心 (2)STM32 GPIO 配置核心(开漏输出) 2. 忙状态判定原理 (1)核心定义 (2)空闲状态双重侦听规则 (3)STM32 忙状态实现细节 3. 发送实现原理 (1)发送前准备 (2)逐位发送核心逻辑 (3)发送关键注意事项…

三维动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究附MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

诺特定理:世界是二阶导的吗?

让我们回到诺特定理,真正的奥妙就在于此。我们现在有了工具:拉格朗日函数、欧拉-拉格朗日定理,让我们看看它们能构建出什么。 假设你的拉格朗日函数 \(L(q, \dot{q}, t)\) 具有连续对称性。这意味着存在某种变换 \(…

GESP认证C++编程真题解析 | 202306 四级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

洛谷 P11606 [PA 2016] 构树 / Reorganizacja - Rye

洛谷 P11606 [PA 2016] 构树 / Reorganizacja构造好题题目传送门 题目大意 有 \(n\) 个节点和 \(m\) 条限制,每条限制形如 \(x,y,T\) 或 \(x,y,N\) 分别表示 \(y\) 一定是 \(x\) 的祖先和 \(y\) 一定不是 \(x\) 的祖先…

CPU占用高排查

top命令,查看占用高的进程id top -p <进程id> -H -H参数显示进程内的线程列表,查看是哪个线程id jstack -p <进程id> | grep <线程id> -C 30 线程id在jdk8可能是16进制需要改下 查看对应线程的堆栈…

GESP认证C++编程真题解析 | 202303 二级

​欢迎大家订阅我的专栏:算法题解:C++与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的…

智能风控平台 scalability 设计:AI应用架构师的经验分享

智能风控平台Scalability设计实战&#xff1a;AI应用架构师的5个核心策略 一、引言&#xff1a;为什么智能风控平台必须重视Scalability&#xff1f; 1. 痛点引入&#xff1a;你是否遇到过这些“崩溃瞬间”&#xff1f; 作为AI应用架构师&#xff0c;我曾亲历某电商平台大促期间…