如何在Golang中使用errors创建错误对象_自定义错误类型和信息


Go错误处理需结合自定义类型与错误包装:用%w保留原始错误,errors.Is判断哨兵错误,errors.As安全提取自定义错误,避免==比较。

在 Go 中,errors 包提供了创建和处理错误的基础能力,但真正灵活、可维护的错误处理往往需要结合自定义错误类型和更丰富的上下文信息。Go 1.13 引入的错误包装(`%w`)和 `errors.Is`/`errors.As` 等函数,让错误链和类型断言变得更可靠。

使用 errors.New 和 fmt.Errorf 创建基础错误

最简单的方式是用 errors.New 创建静态字符串错误,或用 fmt.Errorf 动态拼接带变量的信息:

  • err := errors.New("failed to open config file")
  • err := fmt.Errorf("failed to parse %s: %v", filename, errParse)

注意:直接拼接字符串会丢失原始错误,如需保留底层原因,应使用 %w 动词进行包装:

  • err := fmt.Errorf("loading config: %w", os.Open(filename))

定义自定义错误类型(实现 error 接口)

当需要区分错误种类、携带结构化字段(如错误码、重试标志、HTTP 状态码),可定义结构体并实现 Error() string 方法:

type ValidationError struct {
    Field   string
    Message string
    Code    int
}

func (e *ValidationError) Error() string { return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message) }

这样既能提供可读信息,又支持类型断言判断错误类型:

  • if ve, ok := err.(*ValidationError); ok { /* 处理校验错误 */ }

用 errors.As 安全提取自定义错误(支持错误链)

相比类型断言,errors.As 能穿透多层包装找到目标错误类型,更健壮:

var ve *ValidationError
if errors.As(err, &ve) {
    log.Printf("Validation error on %s, code: %d", ve.Field, ve.Code)
}

它会从最内层错误开始逐级检查,直到匹配或遍历完错误链。

用 errors.Is 判断是否为特定错误(常用于哨兵错误)

对于预定义的全局错误变量(哨兵错误),推荐用 errors.Is 判断相等性,它同样支持错误链:

var ErrNotFound = errors.New("not found")

// 即使 err 是 fmt.Errorf("user not found: %w", ErrNotFound),仍能匹配 if errors.Is(err, ErrNotFound) { return http.StatusNotFound }

避免直接用 == 比较,因为包装后的错误地址已变。


# go  # golang  # ai  # 状态码  # String  # if  # Error  # 字符串  # 结构体  # 接口  # 对象  # http  # 自定义  # 遍历  # 如需  # 它会  # 最简单  # 既能  # 或用  # 仍能  # 重试  # 结构化 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win10怎样清理C盘Steam游戏缓存_Win10清理Steam游戏缓存步骤【步骤】  Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】  Windows 10怎么录屏_Windows 10使用Xbox Game Bar录制屏幕视频教程  Python项目维护经验_长期演进说明【指导】  windows 10专注助手怎么关闭_windows 10禁用通知提醒功能方法  Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】  Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】  windows系统如何安装cab更新补丁_windows手动安装更新包教程  Python包结构设计_大型项目组织解析【指导】  c# 服务器GC和工作站GC的区别和设置  Win10怎么设置开机密码_Windows10账户登录密码设置与取消  Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】  Python集合操作技巧_高效去重解析【教程】  如何理解Go指针和内存分配关系_Go Pointer内存Model解析  Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】  Win11如何连接Xbox手柄 Win11蓝牙连接游戏手柄教程【步骤】  Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  Python多进程教程_multiprocessing模块实战  Django 密码修改后会话失效的解决方案  如何在Golang中使用replace替换模块_指定本地或远程路径  如何正确访问 Laravel 模型或对象的属性而非调用不存在的方法  Win11怎么清理C盘OneDrive缓存_Win11清理OneDrive缓存技巧【方法】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】  c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】  php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】  windows系统找不到无线网络怎么办_windows WLAN适配器故障排查  c++怎么使用std::tuple存储多元组数据_c++ 11获取元素与解包操作【技巧】  Flask 表单数据通过 SMTP 发送邮件的完整实现教程  Win10如何更改开机密码_Windows10登录选项更改密码  如何在 Laravel 中通过嵌套关联关系进行 orderBy 排序  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  Win11怎么卸载Photos应用_Win11卸载Photos应用方法【教程】  Windows10如何彻底关闭自动更新_Win10服务与组策略双重禁用  MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录  php485函数执行慢怎么优化_php485性能提升小技巧【技巧】  c++中如何进行二进制文件读写_c++ read与write函数用法  Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】  Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】  如何在 VS Code 中正确配置并使用 NumPy  Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】  Linux如何申请SSL免费证书_Linux下Certbot安装与Nginx自动续期【指南】  Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数  怎么将XML数据可视化 D3.js加载XML  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  Win11关机快捷键是什么_Win11快速关机方法【大全】  如何使用Golang实现云原生应用弹性伸缩_自动应对流量变化  Go语言中正确反序列化多个同级XML元素为结构体切片的方法  Mac电脑如何恢复出厂设置_Mac抹掉数据并重装系统【安全指南】 

 2025-12-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.