统一捕获请求异常需中间件拦截+错误包装+标准化响应结构,定义ErrorResponse含code/message/data,用recover捕获panic并转JSON响应,Gin中替换Recovery并规范c.Error处理业务错误,HTTP状态码与业务码分层设计。
在 Go Web 开发中,统一捕获请求异常并返回标准化错误响应,关键在于中间件拦截 + 错误包装 + 统一响应结构。不依赖框架时,用 http.Handler 装饰器即可实现;使用 Gin 或 Echo 等框架时,则利用其内置的 Recovery 和自定义错误处理机制。
先约定前后端可解析的错误格式,包含状态码、错误码、消息和可选详情:
type ErrorResponse struct {
Code int `json:"code"` // 业务错误码,如 1001
Message string `json:"message"` // 用户友好的提示
Data any `json:"data,omitempty"`
}
func (e *ErrorResponse) WithData(data any) *ErrorResponse {
e.Data = data
return e
}
// 快捷构造函数
func NewError(code int, msg string) *ErrorResponse {
return &ErrorResponse{Code: code, Message: msg}
}
对标准 net/http,编写一个 recover 中间件,拦截 panic 并转为 500 响应;同时支持手动注入错误(如通过 context 传递):
defe
r + recover() 捕获 panic,记录日志并返回 500 Internal Server Error
http.Error 或写入自定义错误响应前,先检查是否已写 header,避免重复写入context.WithValue 注入,再由中间件读取并渲染,避免每个 handler 都手动写错误逻辑Gin 自带 gin.Recovery() 中间件,但默认只打印 panic 日志。要统一返回 JSON 错误,需自定义 Recovery 函数:
r.Use(customRecovery)
customRecovery 中,recover() 后构造 ErrorResponse,调用 c.AbortWithStatusJSON(500, errResp)
c.Error(err) 抛出业务错误,再通过 c.Errors.ByType(gin.ErrorTypePrivate) 在最后统一渲染避免在 handler 里直接 return 或 panic,而是封装错误工具函数:
ErrUserNotFound = errors.New("user not found")
c.Error(errors.Join(ErrUserNotFound, err)),或直接 c.AbortWithStatusJSON(404, NewError(2004, "用户不存在"))
ShouldBind 失败时自动调用 c.Error(),你只需在 Recovery 后统一处理不复杂但容易忽略的是:HTTP 状态码与业务错误码要分层设计——状态码表示协议层结果(4xx/5xx),业务码(如 1001)用于前端路由或提示逻辑。两者都应在响应中明确体现。
# js
# 前端
# json
# go
# golang
# 工具
# 后端
# 路由
# 状态码
# 中间件
# gin
# echo
# 封装
# Error
# internal
# http
# 自定义
# 错误码
# 的是
# 只需
# 不存在
# 可选
# 应在
# 自带
# 抛出
# 关键在于
相关文章:
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
如何配置IIS站点权限与局域网访问?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
青岛网站建设如何选择本地服务器?
如何通过PHP快速构建高效问答网站功能?
建站之星下载版如何获取与安装?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
如何配置支付宝与微信支付功能?
如何快速生成专业多端适配建站电话?
如何通过VPS建站无需域名直接访问?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
网站制作话术技巧,网站推广做的好怎么话术?
网站图片在线制作软件,怎么在图片上做链接?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何通过wdcp面板快速创建网站?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
临沂网站制作企业,临沂第三中学官方网站?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
如何用免费手机建站系统零基础打造专业网站?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
微信小程序 input输入框控件详解及实例(多种示例)
宝塔建站后网页无法访问如何解决?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
建站主机功能解析:服务器选择与快速搭建指南
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何在云主机快速搭建网站站点?
如何快速生成高效建站系统源代码?
淘宝制作网站有哪些,淘宝网官网主页?
建站主机无法访问?如何排查域名与服务器问题
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何在建站之星绑定自定义域名?
手机网站制作与建设方案,手机网站如何建设?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
建站之星后台密码遗忘如何找回?
专业网站建设制作报价,网页设计制作要考什么证?
建站主机是什么?如何选择适合的建站主机?
建站与域名管理如何高效结合?
常州企业网站制作公司,全国继续教育网怎么登录?
香港服务器选型指南:免备案配置与高效建站方案解析
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何用wdcp快速搭建高效网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。