Go中统一错误处理需定义AppError结构体封装状态码、业务码、消息等,业务函数返回*AppError,HTTP层用中间件拦截并序列化为标准JSON响应,兼顾安全与日志可追溯性。
在 Go 中实现统一错误处理并封装函
数返回统一格式,核心是定义清晰的错误结构、规范错误创建方式、统一响应体,并在 HTTP 层或业务入口处集中拦截和转换错误。不依赖框架也能做到简洁可控。
避免直接返回 error 接口导致信息丢失,自定义结构体携带状态码、业务码、消息和可选详情:
type AppError struct {
Code int `json:"code"` // HTTP 状态码(如 400、500)
ErrCode int `json:"err_code"` // 业务错误码(如 1001 表示用户不存在)
Msg string `json:"msg"`
Details []string `json:"details,omitempty"`
}
func (e *AppError) Error() string {
return fmt.Sprintf("[%d]%s", e.ErrCode, e.Msg)
}
// 快捷构造函数
func NewBadRequest(errCode int, msg string, details ...string) *AppError {
return &AppError{Code: 400, ErrCode: errCode, Msg: msg, Details: details}
}
func NewInternalError(errCode int, msg string, details ...string) *AppError {
return &AppError{Code: 500, ErrCode: errCode, Msg: msg, Details: details}
}
所有服务层函数遵循相同签名,错误一律用 *AppError,不混用标准 errors.New 或 fmt.Errorf:
nil
*AppError,不 panic,不裸露底层错误(如数据库驱动错误)user, err := userService.GetUserByID(ctx, id),err 类型为 error,但实际应为 *AppError
在 handler 中用 defer 或中间件捕获错误,转为标准 JSON 响应:
func jsonHandler(f func() (interface{}, error)) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
data, err := f()
if err != nil {
var appErr *AppError
if errors.As(err, &appErr) {
w.WriteHeader(appErr.Code)
json.NewEncoder(w).Encode(map[string]interface{}{
"success": false,
"data": nil,
"error": appErr,
})
return
}
// 非 AppError,兜底为 500
w.WriteHeader(500)
json.NewEncoder(w).Encode(map[string]interface{}{
"success": false,
"data": nil,
"error": &AppError{Code: 500, ErrCode: 9999, Msg: "Unknown server error"},
})
return
}
w.WriteHeader(200)
json.NewEncoder(w).Encode(map[string]interface{}{
"success": true,
"data": data,
"error": nil,
})
}
}
// 使用示例
http.HandleFunc("/api/user/:id", jsonHandler(func() (interface{}, error) {
id := chi.URLParam(r, "id")
user, err := userService.GetUserByID(r.Context(), id)
if err != nil {
return nil, err // 直接返回 *AppError
}
return user, nil
}))
对外响应要简洁安全,对内日志需保留上下文:
Msg 应通用友好(如“用户名已存在”),不暴露技术细节fmt.Sprintf("%+v", err))*AppError 中加字段 LogID string 关联日志,但不返回给客户端
# js
# 前端
# json
# go
# golang
# app
# 栈
# ai
# win
# 状态码
# 中间件
# String
# 封装
# Error
# 结构体
# 接口
# nil
# 数据库
# http
# 中统
# 也能
# 错误码
# 并在
# 不存在
# 自定义
# 可选
# 但不
# 中加
# 客户端
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何高效获取循环末次生成的 NumPy 数组最后一个元素(无需额外循环)
Mac如何使用听写功能_Mac语音输入打字【效率技巧】
Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】
Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】
Windows10如何更改任务栏高度_Win10解除锁定调整大小
c++ std::future和std::promise c++线程间通信【教程】
Windows服务无法启动错误1067是什么_进程意外终止的解决方法
Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序
Python数据挖掘进阶教程_分类回归与聚类案例解析
如何在Golang中处理URL参数_Golang URL参数解析与路由映射方法
Python随机数生成_random模块说明【指导】
Windows蓝屏错误0x00000018怎么处理_驱动初始化错误解决
c++怎么实现大文件的分块读写_c++ 文件指针seekp与seekg偏移控制【方法】
PHP主流架构怎么监控运行状态_工具推荐【操作】
Windows系统被恶意软件破坏后的恢复策略_错误提示修复方式
PowerShell怎么创建复杂的XML结构
Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】
Win11怎么关闭开机声音_Win11系统启动提示音静音【教程】
如何在Golang中引入测试模块_Golang测试包导入与使用实践
Win11色盲模式怎么开_Win11屏幕颜色滤镜设置【关怀】
Windows如何拦截2345弹窗广告_Windows拦截2345弹窗方法【步骤】
c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】
Mac怎么进行语音输入_Mac听写功能设置与使用【教程】
Windows资源管理器总是卡顿或重启怎么办?(修复方法)
Go语言中slice追加操作的底层共享机制详解
Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】
mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】
Python多进程教程_multiprocessing模块实战
如何使用正则表达式精确匹配最多含一个换行符的 start-end 区段
Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】
Python音视频处理高级项目教程_FFmpegPydub剪辑与特效
Windows蓝屏错误0x0000001E怎么修复_KMODEEXCEPTIONNOTHANDLED排查
LINUX下如何配置VLAN虚拟局域网_在LINUX交换机与服务器上的实现
windows如何测试网速_windows系统网络速度测试方法
Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】
php增删改查报错1054怎么办_字段名错误排查修复【解答】
php删除数据怎么软删除_添加is_del字段标记删除【技巧】
Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】
c# await 一个已经完成的Task会发生什么
Win11开机Logo怎么换_Win11自定义启动画面工具【高级】
Python实现图数据库操作_Neo4j核心CRUD与图算法解析
Win11怎么调整屏幕亮度_Windows 11调节显示器亮度护眼设置【步骤】
微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】
Windows10系统服务优化指南_Win10禁用不必要服务提升性能
Windows10电脑怎么设置文件权限_Win10安全选项卡所有者修改
Win11怎么自动隐藏任务栏_Win11全屏显示设置【美化】
如何使用Golang table-driven fuzz测试_多数据随机化发现缺陷
Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】
Win11文件夹预览图不显示怎么办_Win11缩略图缓存重建修复【教程】
C++中引用和指针有什么区别?(代码说明)
2025-12-25
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。