gogin ErrorMiddleware的使用错误
go gin func ErrorMiddleware() gin.HandlerFunc { return func(c *gin.Context) { defer func() { if err : recover(); err ! nil { c.IndentedJSON(http.StatusOK, basedto.ResultError(err.(error))) c.Abort() } }() // 处理业务错误 if len(c.Errors) 0 { // 你可以在这里定义你的错误处理逻辑 golog.Error(jsonutils.ToJsonPretty(c.Errors)) c.JSON(http.StatusInternalServerError, gin.H{message: Internal Server Error}) c.Abort() // 终止请求 } c.Next() } }代码有没有问题这段代码有严重问题核心在于c.Errors的检查时机完全错误。以下是逐条分析❌ 核心问题1.c.Errors检查在c.Next()之前 → 永远为空go// 此时后续 Handler 还没执行c.Errors 永远是空的 if len(c.Errors) 0 { ... } c.Next() // 后续 Handler 在这里才执行修复必须放到c.Next()之后。2.recover()中的类型断言可能二次 Panicgoerr.(error) // 如果 recover 到的不是 error比如字符串 panic(xxx)这里会再 panic虽然 recover 里再 panic 会被 Go 运行时吞掉但不够安全。3. 响应写入时机问题如果 panic 发生在某个 Handler 已经调用了c.JSON()之后recover 中再次调用c.IndentedJSON会导致http: superfluous response.WriteHeader call警告。✅ 修复后的代码gofunc ErrorMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 1. 先注册 defer recover必须在最前面 defer func() { if r : recover(); r ! nil { // 安全地处理任意类型 var errMsg string switch e : r.(type) { case error: errMsg e.Error() case string: errMsg e default: errMsg fmt.Sprintf(unknown panic: %v, r) } golog.Error(panic recovered: , errMsg) // 避免重复写入 if !c.Writer.Written() { c.IndentedJSON(http.StatusOK, basedto.ResultError(errors.New(errMsg))) } c.Abort() } }() // 2. 执行后续 Handler c.Next() // 3. 在 c.Next() 之后检查业务错误 if len(c.Errors) 0 { golog.Error(jsonutils.ToJsonPretty(c.Errors)) // 取最后一个错误或合并所有错误 lastErr : c.Errors.Last() if !c.Writer.Written() { c.JSON(http.StatusInternalServerError, gin.H{ message: lastErr.Error(), }) } // c.Next() 已经执行完这里不需要 Abort() } } } 关键差异对照表格问题你的代码修复后c.Errors检查时机c.Next()之前永远空c.Next()之后recover 类型断言err.(error)可能二次 panicswitch安全处理任意类型重复写入风险无保护c.Writer.Written()判断Abort()位置c.Next()前会阻止执行只在 recover 中使用 额外建议如果你的业务代码是通过c.Error(err)收集错误而非直接c.JSON返回建议统一错误码go// 业务 Handler 中 if err ! nil { c.Error(err) // 不直接返回交给中间件统一处理 return // 终止当前 Handler但继续走中间件 }如果你已经在 Handler 里直接c.JSON返回错误了那c.Errors机制就用不上这个中间件里的c.Errors分支可以删掉只保留 recover 即可。需要我帮你改成只处理 panic 的精简版本吗

相关新闻

Docker 部署 Jenkins 完整指南(含升级、迁移、避坑)

Docker 部署 Jenkins 完整指南(含升级、迁移、避坑)

目录 一、环境前置 方式 1:docker run 快速启动 1. 创建宿主机持久化目录 2. 启动命令 方式 2:docker-compose.yml(推荐生产使用) 二、首次访问初始化 重点:Docker 环境下 升级 Jenkins 重点:Docke…

2026/7/31 17:47:02 阅读更多 →
Jenkins 迁移 + 版本升级 完整实操方案

Jenkins 迁移 + 版本升级 完整实操方案

目录 一、先确认关键信息 1)找到 JENKINS_HOME 2)版本兼容性提醒 场景 1:本机 Jenkins 版本升级(不迁移机器) 步骤 场景 2:跨服务器迁移(旧机器 → 新机器,可顺便升级&#xf…

2026/7/31 17:47:02 阅读更多 →
terminator:超级终端

terminator:超级终端

一、终端terminator安装:sudo apt install terminator使用:ctrlaltT启动terminator ctrlshiftw删除窗口 ctrlshiftE水平添加窗口ctrlshiftO垂直添加窗口 alt上下左右选定不同窗口

2026/7/31 17:47:02 阅读更多 →

最新新闻

从“打卡式管理”到“意图感知办公”:AI混合办公管理的范式跃迁(含2023-2024全球TOP10案例拆解)

从“打卡式管理”到“意图感知办公”:AI混合办公管理的范式跃迁(含2023-2024全球TOP10案例拆解)

更多请点击: https://kaifayun.com 第一章:从“打卡式管理”到“意图感知办公”:AI混合办公管理的范式跃迁 传统考勤系统依赖固定时间点的签到/签退动作,将员工行为简化为二进制状态(在线/离线、在岗/缺勤&#xff09…

2026/7/31 18:20:14 阅读更多 →
为什么你的AI学习计划总失败?5类进度偏差图谱+对应干预策略(附GitHub开源诊断工具包)

为什么你的AI学习计划总失败?5类进度偏差图谱+对应干预策略(附GitHub开源诊断工具包)

更多请点击: https://kaifayun.com 第一章:AI 学习进度跟踪 在 AI 学习过程中,持续、可量化的进度跟踪是避免“学而无感”和“重复造轮子”的关键。有效的跟踪机制不仅反映知识积累的广度与深度,还能暴露理解盲区与实践断层。 核…

2026/7/31 18:20:14 阅读更多 →
STM32F103看门狗在需要低功耗的电池供电产品中如何应用

STM32F103看门狗在需要低功耗的电池供电产品中如何应用

STM32系列MCU内部具有独立看门狗(IWDG)和窗口看门狗(WWDG),它们的差别如下:看门狗开启之后通过软件无法关闭,网上有很多教程说通过系统复位后不再去初始化看门狗就可以了,虽然此方法可行,但总觉得有点多此一举,既然都要…

2026/7/31 18:20:14 阅读更多 →
智慧校园IoT落地:智能锁身份核验+通断电联动,解决校园安全与运维痛点

智慧校园IoT落地:智能锁身份核验+通断电联动,解决校园安全与运维痛点

在智慧校园精细化建设进程中,学生宿舍、教学楼、实训功能房的人员安防、通行管控、用电安全及后勤运维,始终是高校管理的重难点场景。传统机械锁、普通门禁模式存在明显短板:身份核验粗放、无法精准绑定学生信息,开门方式单一依赖…

2026/7/31 18:20:14 阅读更多 →
物联网解决方案:民宿/网约房人证核验+远程授权,破解合规与运维痛点

物联网解决方案:民宿/网约房人证核验+远程授权,破解合规与运维痛点

随着国内住宿行业监管体系持续完善,民宿、网约房等分散式共享住宿业态,正式进入强合规、精细化、无人化管理阶段。传统人工登记、机械锁、静态密码锁的管理模式,存在身份核验缺失、安全溯源空白、人工运维成本高、权限管控混乱等诸多顽疾&…

2026/7/31 18:20:14 阅读更多 →
KoboldCPP终极指南:3步零配置部署本地AI,免费运行GGUF模型

KoboldCPP终极指南:3步零配置部署本地AI,免费运行GGUF模型

KoboldCPP终极指南:3步零配置部署本地AI,免费运行GGUF模型 【免费下载链接】koboldcpp Run GGUF models easily with a KoboldAI UI. One File. Zero Install. 项目地址: https://gitcode.com/gh_mirrors/ko/koboldcpp 想在自己的电脑上运行强大的…

2026/7/31 18:19:14 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻