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

gin error如何返回结果

在 Gin 中处理错误并返回结果,常见有以下几种方式:

1. 直接返回 JSON 错误(最简单)

go

func GetUser(c *gin.Context) { user, err := db.FindUser(id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "code": 500, "msg": "查询用户失败", "data": nil, }) return // 注意必须 return,防止继续执行 } c.JSON(http.StatusOK, gin.H{ "code": 0, "msg": "success", "data": user, }) }

2. 使用AbortWithStatusJSON(推荐用于中间件或需终止后续处理时)

go

if !isAuthorized { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "code": 401, "msg": "未授权", }) return }

c.JSON的区别:AbortWithStatusJSON会设置c.Abort(),阻止后续中间件/Handler 执行。

3. 统一错误响应结构体(项目规范做法)

go

type Response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` } func Error(c *gin.Context, code int, msg string) { c.JSON(code, Response{Code: code, Msg: msg, Data: nil}) } func Success(c *gin.Context, data interface{}) { c.JSON(http.StatusOK, Response{Code: 0, Msg: "success", Data: data}) } // 使用 func Handler(c *gin.Context) { if err := doSomething(); err != nil { Error(c, 500, err.Error()) return } Success(c, result) }

4. 全局错误恢复中间件

go

func RecoveryMiddleware() gin.HandlerFunc { return func(c *gin.Context) { defer func() { if err := recover(); err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "code": 500, "msg": "服务器内部错误", }) } }() c.Next() } } // 注册 r.Use(RecoveryMiddleware())

关键注意点

表格

要点说明
必须return调用c.JSON后如果不return,后续代码会继续执行
状态码建议 HTTP status 与业务 code 分开,HTTP 用标准码,业务 code 放 body
Abort鉴权类错误用AbortWithStatusJSON,普通业务错误用c.JSON即可

你目前是在写具体的 Handler 逻辑,还是想搭建一套全局的错误处理机制?可以帮你进一步细化。

http://www.jsqmd.com/news/1301878/

相关文章:

  • Java Finalization‘s Memory-Retention Issues 及Reference类解析
  • AI取代人类工作的5个临界点已出现:HR总监亲授3步职业免疫法(附2025技能缺口白皮书)
  • 26年光纤放大器哪家好
  • 北京平谷回收包包去哪里?闲置奢侈品名包变现渠道盘点 - 生活时报
  • 如何在Linux上无缝运行Windows应用:WinBoat终极指南
  • DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(上)
  • 二元碳基–硅基双种群自指博弈方程组解析解、稳定域相图(SH9自指宇宙学·递归对抗拓扑学规范研究)
  • Coze扣子平台AI智能体开发:从入门到实战应用指南
  • 2026钱塘区水下焊接施工公司推荐,无人机打捞公司哪家好?昌明潜水打捞救援口碑推荐 - GEO99
  • 【爱马仕】Hermes 桌面客户端本地部署教程,降低环境搭建难度
  • 3分钟上手form-generator:Element UI表单开发的革命性自动化工具
  • 本地服务行业数字化:好客搜智搜 GEO 同城流量运营方案
  • 2026年中网创投实践效果分享
  • 2026监利实木家具怎么挑?源氏木语纯实木十年质保不翻车 - 五大品牌极选
  • 《PandaWiki本地AI知识库实战:飞牛NAS实现公网访问》
  • 仅剩最后87份!2024油画风格ControlNet预训练权重包泄露:含梵高/伦勃朗/莫奈三套专属线稿引导模型
  • GPT技术核心架构与工程实践全解析
  • redis8.6.3创建自定义acl账号添加@cluster报错
  • 零基础部署 OpenClaw 自动化 AI,不用手动配置 Python 运行环境(含安装包)
  • 2026年廊坊博美保温玻璃棉卷毡厂家挑选攻略及行业优质企业盘点 - 比奇堡111
  • Velodyne激光雷达点云数据处理指南:从原始数据包到三维点云可视化
  • 泛程序代码常见坑点整理与避坑思路
  • 如何免费解锁Wand专业版功能:3步实现无限游戏时间与远程控制
  • 3分钟极速汉化GitHub Desktop:告别英文界面,拥抱中文开发体验
  • 终极B站音频播放器:将视频网站变身为你的专属音乐平台
  • 2026年7月GEO营销工具排行榜:TOP5综合盘点 - 资讯报道
  • 【文心一言插件市场深度解密】:2024年唯一官方认证插件生态全景图与接入避坑指南
  • 本土纸类包装厂商选型参考 2026:东莞彩箱包装定制源头工厂推荐与专业选购思路 - 变量人生001
  • RAG 召回90%却答错?Taotoken实测发现重排阶段3个致命疏忽
  • 2026龙文区高立边成型机厂家推荐:高立边直扇一体机厂家哪家好选购指南与实用避坑攻略 - GEO99