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/10/11 1:27:35 阅读更多 →
Jenkins 迁移 + 版本升级 完整实操方案

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

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

2026/10/8 16:18:59 阅读更多 →
terminator:超级终端

terminator:超级终端

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

2026/10/8 22:07:22 阅读更多 →

最新新闻

面向对象程序设计-第一阶段补充-师生友谊

面向对象程序设计-第一阶段补充-师生友谊

作者 GONG单位 哈尔滨华德学院以下程序分别定义了学生类和教师类,学生有N个课程成绩,可以打印成绩单,任课教师负责为学生填报相应课程的成绩。类的声明已经给出,请按各类成员函数的功能说明完成相应的完整定义。并满足主函数的测试…

2026/10/11 1:27:28 阅读更多 →
环形补给站算法:从前缀和到单调栈的线性优化实战

环形补给站算法:从前缀和到单调栈的线性优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 1:27:28 阅读更多 →
AI翻译神器高效助力多语言沟通 精准便捷满足各类翻译需求

AI翻译神器高效助力多语言沟通 精准便捷满足各类翻译需求

构建一个高质量的国外参考文献库,听起来很宏大,但其实就是把“找、管、用”这三件事做对。整个过程最关键的一步,是选对一个能陪你走完全程的“智能伙伴”。我强烈推荐 切问学术,它能让这件事从杂乱无序变得井井有条。 第一步&am…

2026/10/11 1:27:28 阅读更多 →
AI导论教案:从感知机到LLM的可验证教学实践

AI导论教案:从感知机到LLM的可验证教学实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 1:27:28 阅读更多 →
链表找环:Floyd 判圈算法(LeetCode 141  142 )

链表找环:Floyd 判圈算法(LeetCode 141 142 )

在链表相关的算法题中,「判断链表是否有环」以及「寻找入环点」是两道极其经典的题目。它们不仅考察了对指针的操作,更蕴含了一个巧妙的数学原理——Floyd 判圈算法(龟兔赛跑算法)。 一、 LeetCode 141:判断链表中是否…

2026/10/11 1:27:28 阅读更多 →
工业AI质检大模型技术方案:小样本快速换线与边缘部署实战

工业AI质检大模型技术方案:小样本快速换线与边缘部署实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 1:26:28 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →