千家信息网

Go应用中优雅处理Error的技巧有哪些

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章将为大家详细讲解有关Go应用中优雅处理Error的技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。用户自定义类型我们将重写的Go里自带的error类
千家信息网最后更新 2026年11月02日Go应用中优雅处理Error的技巧有哪些

这篇文章将为大家详细讲解有关Go应用中优雅处理Error的技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

用户自定义类型

我们将重写的Go里自带的error类型,首先从一个自定义的错误类型开始,该错误类型将在程序中识别为error类型。因此,我们引入一个封装了Go的 error的新自定义Error类型。

type GoError struct {   error}

上下文数据

当我们在Go中说error是一个值时,它是字符串值 - 任何实现了Error() string函数的类型都可以视作error类型。将字符串值视为error会使跨层的error处理复杂化,因此处理error字符串信息并不是正确的方法。所以我们可以把字符串和错误码解耦:

type GoError struct {   error   Code    string}

现在对error的处理将基于错误码Code字段而不是字符串。让我们通过上下文数据进一步对错误字符串进行解耦,在上下文数据中可以使用i18n包进行国际化。

type GoError struct {   error   Code    string   Data    map[string]interface{}}

Data包含用于构造错误字符串的上下文数据。错误字符串可以通过数据模板化:

//i18N def
"InvalidParamValue": "Invalid parameter value '{{.actual}}', expected '{{.expected}}' for '{{.name}}'"

在i18N定义文件中,错误码Code将会映射到使用Data构建的模板化的错误字符串中。

原因(Causes)

error可能发生在任何一层,有必要为每一层提供处理error的选项,并在不丢失原始error值的情况下进一步使用附加的上下文信息对error进行包装。GoError结构体可以用Causes进一步封装,用来保存整个错误堆栈。

type GoError struct {   error   Code    string   Data    map[string]interface{}   Causes  []error}

如果必须保存多个error数据,则causes是一个数组类型,并将其设置为基本error类型,以便在程序中包含该原因的第三方错误。

组件(Component)

标记层组件将有助于识别error发生在哪一层,并且可以避免不必要的error wrap。例如,如果service类型的error组件发生在服务层,则可能不需要wrap error。检查组件信息将有助于防止暴露给用户不应该通知的error,比如数据库error:

type GoError struct {   error   Code      string   Data      map[string]interface{}   Causes    []error   Component ErrComponent}type ErrComponent stringconst (   ErrService  ErrComponent = "service"   ErrRepo     ErrComponent = "repository"   ErrLib      ErrComponent = "library")

响应类型(ResponseType)

添加一个错误响应类型这样可以支持error分类,以便于了解什么错误类型。例如,可以根据响应类型(如NotFound)对error进行分类,像DbRecordNotFound、ResourceNotFound、UserNotFound等等的error都可以归类为 NotFound error。这在多层应用程序开发过程中非常有用,而且是可选的封装:

type GoError struct {   error   Code         string   Data         map[string]interface{}   Causes       []error   Component    ErrComponent   ResponseType ResponseErrType}type ResponseErrType stringconst (   BadRequest    ResponseErrType = "BadRequest"   Forbidden     ResponseErrType = "Forbidden"   NotFound      ResponseErrType = "NotFound"   AlreadyExists ResponseErrType = "AlreadyExists")

重试

在少数情况下,出现error会进行重试。retry字段可以通过设置Retryable标记来决定是否要进行error重试:

type GoError struct {   error   Code         string   Message      string   Data         map[string]interface{}   Causes       []error   Component    ErrComponent   ResponseType ResponseErrType   Retryable    bool}

GoError 接口

通过定义一个带有GoError实现的显式error接口,可以简化error检查:

package goerrtype Error interface {   error   Code() string   Message() string   Cause() error   Causes() []error   Data() map[string]interface{}   String() string   ResponseErrType() ResponseErrType   SetResponseType(r ResponseErrType) Error   Component() ErrComponent   SetComponent(c ErrComponent) Error   Retryable() bool   SetRetryable() Error}

抽象error

有了上述的封装方式,更重要的是对error进行抽象,将这些封装保存在同一地方,并提供error函数的可重用性

func ResourceNotFound(id, kind string, cause error) GoError {   data := map[string]interface{}{"kind": kind, "id": id}   return GoError{      Code:         "ResourceNotFound",      Data:         data,      Causes:       []error{cause},      Component:    ErrService,      ResponseType: NotFound,      Retryable:    false,   }}

这个error函数抽象了ResourceNotFound这个error,开发者可以使用这个函数来返回error对象而不是每次创建一个新的对象:

//UserServiceuser, err := u.repo.FindUser(ctx, userId)if err != nil {   if err.ResponseType == NotFound {      return ResourceNotFound(userUid, "User", err)   }   return err}

关于"Go应用中优雅处理Error的技巧有哪些"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

类型 错误 字符 字符串 数据 处理 上下 上下文 封装 函数 应用 程序 篇文章 组件 进一 优雅 技巧 信息 原因 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网金融科技 重生之互联网科技帝国 礼当家互联网科技 狮子座互联网科技有限公司 火传媒上海互联网科技 互联网 新科技 佰商互联网科技有限公司 互联网科技公司招聘 互联网科技中介 南平创想时代互联网科技有限公司 华夏恒生科技与互联网科技 南博望互联网科技有限公司 徐州市互联网科技有限公司 互联网科技资金流入 领航科技大厦互联网公司 互联网科技快讯热点 从那以后互联网科技有限公司 昆明中奇联合互联网科技 深圳互联网科技园地址 科技美学互联网 艺术 互联网高科技 联恩商钥互联网科技有限公司 中国的互联网科技企业的崛起 湖北码尼互联网科技有限公司电话 洛阳共同富裕互联网科技有限公司 佛山市拉法互联网科技有限公司 上海科技产业互联网平台 张召忠谈中国互联网科技 福建互联网展示科技馆设计 互联网科技企业商标注意事项
0