news 2026/6/15 16:15:47

SpringBoot 全局异常处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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);}

查看测试结果


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:50:38

大数据领域中 RabbitMQ 的消息压缩技术

大数据场景下RabbitMQ消息压缩实战:从原理到落地的全攻略 摘要/引言 在大数据时代,高吞吐量、大体积消息已成为RabbitMQ的常见挑战:比如电商系统的交易日志(每条10KB+)、物联网的传感器数据(每秒10万条)、数据同步中的全量备份(单条100KB+)。这些场景下,未压缩的消…

作者头像 李华
网站建设 2026/6/15 13:50:55

2. 训练 vs 推理:真正烧钱的是哪一步

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2026年&#xff0c;AI行业的成本结构已经发生根本性转变。本文通过云厂商真实数据揭示&#xff0c;推理的累计成本已超过训练10倍以上&#xff0c;成为真正烧钱的环节…

作者头像 李华
网站建设 2026/6/14 15:10:47

5. vLLM 出现前的推理地狱

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2023年vLLM出现之前&#xff0c;大模型推理面临着显存碎片化、低效调度和高延迟等诸多挑战&#xff0c;被称为"推理地狱"。本文通过回顾pre-vLLM时代的痛点…

作者头像 李华
网站建设 2026/6/15 13:41:52

7. 为什么云厂商集体选择 vLLM

作者&#xff1a;HOS(安全风信子) 日期&#xff1a;2026-01-17 来源平台&#xff1a;GitHub 摘要&#xff1a; 2026年&#xff0c;AWS、阿里云、字节跳动等全球顶级云厂商纷纷选择vLLM作为其大模型推理的核心框架。本文深入分析了云厂商集体选择vLLM的原因&#xff0c;包括高吞…

作者头像 李华
网站建设 2026/6/15 12:52:51

计算机毕设怎么写?从选题到答辩的超详细通关攻略

&#x1f4ab; 关于文星毕设 深耕计算机毕设领域5年&#xff0c;全网累计帮助10000学生顺利毕业&#xff01;CSDN认证全栈技术博主、掘金优质创作者&#xff0c;阿里云开发者社区认证专家。 在校期间曾协助导师完成3届毕业生毕设课题审核、论文格式规范指导、项目代码校验工作&…

作者头像 李华
网站建设 2026/6/12 22:45:24

YOLO26 接入实时视频 - GPU 加速2

经过优化后&#xff0c;稳定在60ms&#xff0c;不卡顿import cv2 from ultralytics import solutions import torch # ✅ 必须在文件顶部 新增导入torch&#xff01;&#xff01;&#xff01; import gc # ✅ 必须在文件顶部 新增导入gc&#xff01;&#xff01;&#xff01…

作者头像 李华