在 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("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 *My
Error) 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)
某些场景(如 net 包)会检查错误是否实现了 Temporary() bool 或 Timeout() 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小时内与您取得联系。