全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Golang中实现自定义错误类型_定义结构体和Error方法

在 Go 中实现自定义错误类型,核心是定义一个结构体,并为它实现 Error() 方法(签名必须是 func() string)。Go 的 error 接口非常简洁,只包含这一个方法,因此只要你的类型实现了它,就自动满足 error 接口。

定义带字段的错误结构体

常见做法是定义一个结构体,内嵌必要信息(如错误码、消息、时间、上下文等),便于调试和分类处理。

例如:

type MyError struct {
    Code    int
    Message string
    File    string
    Line    int
}

func (e *MyError) Error() string {
    return fmt.Sprintf("[%d] %s at %s:%d", e.Code, e.Message, e.File, e.Line)
}

这样创建错误时可以携带丰富上下文:

err := &MyError{
    Code:    4001,
    Message: "invalid user ID",
    File:    "user.go",
    Line:    23,
}
log.Println(err.Error()) // [4001] invalid user ID at user.go:23

让错误支持 fmt.Errorf 包装(可选但推荐)

如果希望自定义错误能被 fmt.Errorf("wrap: %w", err) 正确包装(即支持错误链),需额外实现 Unwrap() error 方法:

type MyError struct {
    Code    int
    Message string
    Cause   error // 可选:用于嵌套原始错误
}

func (e *MyError) Error() string {
    if e.Cause != nil {
        return fmt.Sprintf("%s: %v", e.Message, e.Cause)
    }
    return e.Message
}

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

之后就能用标准方式包装和检查:

original := errors.New("network timeout")
err := &MyError{Code: 500, Message: "service unavailable", Cause: original}
wrapped := fmt.Errorf("backend failed: %w", err)

fmt.Println(errors.Is(wrapped, original)) // true
fmt.Println(errors.Unwrap(wrapped))         // &MyError{...}

提供便捷构造函数(提高可用性)

避免每次手动 new 结构体,封装工厂函数更符合 Go 习惯:

func NewMyError(code int, format string, args ...interface{}) error {
    return &MyError{
        Code:    code,
        Message: fmt.Sprintf(format, args...),
    }
}

// 使用
err := NewMyError(404, "user %s not found", userID)

区分临时性错误(Temporary)或超时错误(Timeout)

某些场景(如 net 包)会检查错误是否实现了 Temporary() boolTimeout() bool。若需兼容这些逻辑,可选择性实现:

func (e *MyError) Temporary() bool {
    return e.Code == 408 || e.Code == 429 || e.Code >= 500 && e.Code < 600
}

func (e *MyError) Timeout() bool {
    return e.Code == 408
}

这样 net/http 客户端或重试库就能根据返回值做智能判断。


# go  # golang  # app  # ai  # String  # 封装  # 构造函数  # Error  # 结构体  # bool  # 接口  # http  # 自定义  # 可选  # 实现了  # 这一  # 就能  # 可用性  # 并为  # 重试  # 内嵌  # 返回值 


相关文章: 西安大型网站制作公司,西安招聘网站最好的是哪个?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何零成本快速生成个人自助网站?  建站之星如何快速生成多端适配网站?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  装修招标网站设计制作流程,装修招标流程?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在阿里云虚拟服务器快速搭建网站?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  开心动漫网站制作软件下载,十分开心动画为何停播?  C++时间戳转换成日期时间的步骤和示例代码  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  高性价比服务器租赁——企业级配置与24小时运维服务  如何用虚拟主机快速搭建网站?详细步骤解析  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站代码制作软件有哪些,如何生成自己网站的代码?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何在云主机上快速搭建网站?  韩国服务器如何优化跨境访问实现高效连接?  如何用狗爹虚拟主机快速搭建网站?  建站之星安装路径如何正确选择及配置?  创业网站制作流程,创业网站可靠吗?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何选择高效便捷的WAP商城建站系统?  *服务器网站为何频现安全漏洞?  如何在建站之星网店版论坛获取技术支持?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何自定义建站之星网站的导航菜单样式?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  中山网站制作网页,中山新生登记系统登记流程?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何通过建站之星自助学习解决操作问题?  建站之星2.7模板:企业网站建设与h5定制设计专题  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何用已有域名快速搭建网站?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  建站三合一如何选?哪家性价比更高?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  平台云上自主建站:模板化设计与智能工具打造高效网站  全景视频制作网站有哪些,全景图怎么做成网页?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  建站之星如何通过成品分离优化网站效率? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。