前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2019年10月17日: Go生态洞察:在Go 1.13中处理错误

2019年10月17日: Go生态洞察:在Go 1.13中处理错误

作者头像
猫头虎
发布2024-04-09 14:27:44
1150
发布2024-04-09 14:27:44
举报
文章被收录于专栏:猫头虎博客专区

2019年10月17日: Go生态洞察:在Go 1.13中处理错误 🐾

摘要

🐯 猫头虎博主来啦!今天我们将深入Go 1.13的错误处理新特性。一起探索如何通过增强的标准库功能,更优雅地处理和检查错误。🔍 准备好一起探索Go的错误处理奥秘了吗?

引言

这篇文章是关于Go 1.13中处理错误的深入解析。Go一直将错误视为值,这种处理方式在过去十年中服务我们良好。尽管标准库对错误的支持较为基础,但新版本为我们带来了一些重要的改进。

正文

🛠️ Go 1.13之前的错误处理
🔍 检查错误

在Go中,错误被视为值。我们通常通过将错误与nil进行比较来检查操作是否失败。有时,我们还会将错误与已知的哨兵值进行比较。

➕ 添加信息

通常,函数会在向调用栈上传递错误时添加信息。一个简单的方法是构建一个包含前一个错误文本的新错误:

代码语言:javascript
复制
if err != nil {
    return fmt.Errorf("decompress %v: %v", name, err)
}
🆕 Go 1.13中的错误处理
🌀 Unwrap方法

Go 1.13引入了Unwrap方法,允许一个错误包含另一个错误。例如,我们可以给QueryError类型添加一个返回其包含错误的Unwrap方法:

代码语言:javascript
复制
func (e *QueryError) Unwrap() error { return e.Err }
🔍 使用Is和As检查错误

Go 1.13的errors包中包括两个新函数:IsAserrors.Is函数比较一个错误与一个值,而errors.As函数检查一个错误是否为特定类型。

🔄 包装错误与%w

在Go 1.13中,fmt.Errorf函数支持一个新的%w动词。当这个动词出现时,fmt.Errorf返回的错误将有一个Unwrap方法返回%w的参数。

🤔 是否包装错误

决定是否包装原始错误取决于新错误创建的上下文。包装一个错误是为了将其暴露给调用者。不包装错误则意味着不暴露实现细节。

📐 自定义错误测试与Is和As方法

errors.Is函数检查链中的每个错误是否与目标值匹配。此外,链中的错误可以通过实现Is方法来声明它与目标匹配。

🔗 错误与包API

返回错误的包应描述程序员可以依赖的那些错误属性。良好设计的包还会避免返回不应依赖的属性错误。

总结

尽管我们讨论的改变只是三个函数和一个格式化动词,但我们希望它们将大大改善Go程序中的错误处理方式。我们期待包装提供额外上下文将成为常态,帮助程序做出更好的决策,帮助程序员更快地发现错误。

参考资料

  • Damien Neil and Jonathan Amsterdam, “Working with Errors in Go 1.13”, 2019年10月17日.
  • Go官方博客
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2019年10月17日: Go生态洞察:在Go 1.13中处理错误 🐾
    • 摘要
      • 引言
        • 正文
          • 🛠️ Go 1.13之前的错误处理
          • 🆕 Go 1.13中的错误处理
          • 🤔 是否包装错误
          • 📐 自定义错误测试与Is和As方法
          • 🔗 错误与包API
        • 总结
          • 参考资料
          相关产品与服务
          腾讯云服务器利旧
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档