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

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.jsqmd.com/news/263954/

相关文章:

  • 计算机小程序毕设实战-基于springboot+微信小程序的服装商城的设计与实现小程序基于微信小程序的在线服装商城店铺的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Python+Vue的 第三方物流管理系统 django Pycharm flask
  • STM32F03C8T6通过AT指令获取天气API-下篇
  • 2024最新大数据架构趋势:云原生与湖仓一体实战指南
  • RAG vs 微调:LLM优化双路径指南 + LLaMA-Factory Online高效落地
  • RoMa v2 - MKT
  • 小程序计算机毕设之基于springboot+微信小程序的服装购物平台的设计与实现小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 吐血推荐10个一键生成论文工具,专科生毕业论文必备!
  • AArch64和X86下的函数调用 - Polaris
  • MCU单总线通信
  • 三维动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究附MATLAB代码
  • 诺特定理:世界是二阶导的吗?
  • GESP认证C++编程真题解析 | 202306 四级
  • 洛谷 P11606 [PA 2016] 构树 / Reorganizacja - Rye
  • CPU占用高排查
  • GESP认证C++编程真题解析 | 202303 二级
  • GESP认证C++编程真题解析 | 202303 二级
  • [豪の算法奇妙冒险] 代码随想录算法训练营第三十一天 | 56-合并区间、738-单调递增的数字
  • MATLAB表格数据处理的项目落地经验(避坑+效率提升)
  • 最新论文 | EarthVL: 武大钟燕飞团队提出渐进式理解/生成框架, 从识别到深度理解遥感地物, 提供专业决策建议 - MKT
  • Flutter × OpenHarmony 跨端开发之汇率转换与汇率卡片展示
  • 《卷一》人形机器人导论:从机械设计到系统集成
  • (1-1)人形机器人的发展历史、趋势与应用场景:人形机器人的发展历程
  • 优雅汇率:Flutter × OpenHarmony 跨端汇率转换计算器实现
  • Flutter × OpenHarmony 汇率转换应用中的智能货币选择器实现
  • (1-2)人形机器人的发展历史、趋势与应用场景:未来趋势与行业需求
  • 提示工程质量保证体系:如何保证Prompt的一致性?
  • 综述北航基于视觉的无人机定位与导航方法研究 - MKT
  • AI原生应用持续学习框架对比:TensorFlow vs PyTorch
  • (1-3)人形机器人的发展历史、趋势与应用场景:人形机器人关键技术体系总览