如何在Golang中统一管理应用错误_Golang error管理策略解析-Golang

Go 中 error 是值而非异常,禁止用 panic 处理业务错误;应统一用带码、上下文、可嵌套的自定义 error 类型,显式返回、透传、结构化日志并保留堆栈。

Go 中 error 不是异常,别用 panic 处理业务错误

Go 的 error 是值,不是控制流机制。把 fmt.Errorf 或自定义 error 当成“抛异常”来用,会导致调用链断裂、堆栈丢失、日志难追溯。真正该用 panic 的只有程序无法继续的致命状态(如初始化失败、配置严重错乱),而非 HTTP 404、DB 记录不存在这类可预期业务错误。

  • HTTP handler 中遇到用户 ID 不存在,应返回 http.StatusNotFound + 封装后的 error,而非 panic
  • 数据库查询返回 sql.ErrNoRows,直接封装为领域错误(如 ErrUserNotFound)并向上返回,不要 log.Fatal 或 os.Exit
  • 所有中间件、handler、service 层函数签名必须显式返回 error,拒绝隐式错误吞没(比如只写 if err != nil { return } 却不处理或透传)

用自定义 error 类型 + 错误码统一分类,而非字符串匹配

靠 strings.Contains(err.Error(), "timeout") 判断错误类型既脆弱又低效。应该定义带错误码(Code)、可选原始错误(cause)、上下文字段(TraceID、UserID)的结构体,并实现 Unwrap() 和 Error() 方法。

type AppError struct {
	Code    string
	Message string
	Cause   error
	TraceID string
	UserID  string
}

func (e *AppError) Error() string {
	return fmt.Sprintf("[%s] %s", e.Code, e.Message)
}

func (e *AppError) Unwrap() error {
	return e.Cause
}

var (
	ErrUserNotFound = &AppError{Code: "USER_NOT_FOUND", Message: "user does not exist"}
	ErrInvalidToken = &AppError{Code: "INVALID_TOKEN", Message: "token is expired or malformed"}
)
  • 所有错误创建统一走工厂函数(如 NewAppError(code, msg).WithCause(err).WithTraceID(tid)),避免零散 &AppError{...}
  • 下游通过 errors.Is(err, ErrUserNotFound) 或 errors.As(err, &e) 判断类型,不依赖字符串
  • 错误码建议用大写蛇形(DB_CONN_TIMEOUT),和 HTTP 状态码、gRPC 状态码对齐,方便网关/前端映射

在关键路径上用 errors.Join 合并多个子错误,但注意日志可读性

批量操作(如同时调用 3 个下游服务)失败时,单个 error 无法表达多点失败。Go 1.20+ 的 errors.Join 可合并多个 error,但默认输出是换行拼接,日志系统可能切分行导致解析困难。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何在Golang中统一管理应用错误_Golang error管理策略解析-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008466+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4008467+
  • 本周更新: 0+
  • 最后更新: 2026-03-16