Go 最新版本 1.13 中新增了 errors 的一些特性,有助于我们更优雅的处理业务逻辑中报错的问题。

本文主要展示 errors 包中新增方法的用法。

核心思想:套娃

啥意思呢?这玩意就像套娃一样,从上往下扒,拿走一个还有一个,再拿走一个,诶还有一个,如果你愿意,可以一直扒到最底下没有了为止。

基本用法

1. 创建一个被包装的 error

方式一:fmt.Errorf

使用 %w 参数返回一个被包装的 error

err1 := errors.New("new error")

err2 := fmt.Errorf("err2: [%w]", err1)

err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(err3)

// output

err3: [err2: [new error]]

err2 就是一个合法的被包装的 error,同样地,err3 也是一个被包装的 error,如此可以一直套下去。

方式二:自定义 struct

type WarpError struct {

msg string

err error

}

func (e *WarpError) Error() string {

return e.msg

}

func (e *WrapError) Unwrap() error {

return e.err

}

之前看过源码的同学可能已经知道了,这就是 fmt/errors.go 中关于 warp 的结构。

就,很简单。自定义一个实现了 Unwrap 方法的 struct 就可以了。

2. 拆开一个被包装的 error

errors.Unwrap

err1 := errors.New("new error")

err2 := fmt.Errorf("err2: [%w]", err1)

err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(errors.Unwrap(err3))

fmt.Println(errors.Unwrap(errors.Unwrap(err3)))

// output

err2: [new error]

new error

3. 判断被包装的 error 是否是包含指定错误

errors.Is

当多层调用返回的错误被一次次地包装起来,我们在调用链上游拿到的错误如何判断是否是底层的某个错误呢?

它递归调用 Unwrap 并判断每一层的 err 是否相等,如果有任何一层 err 和传入的目标错误相等,则返回 true。

err1 := errors.New("new error")

err2 := fmt.Errorf("err2: [%w]", err1)

err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(errors.Is(err3, err2))

fmt.Println(errors.Is(err3, err1))

// output

true

true

4. 提取指定类型的错误

errors.As

这个和上面的 errors.Is 大体上是一样的,区别在于 Is 是严格判断相等,即两个 error 是否相等。

而 As 则是判断类型是否相同,并提取第一个符合目标类型的错误,用来统一处理某一类错误。

type ErrorString struct {

s string

}

func (e *ErrorString) Error() string {

return e.s

}

var targetErr *ErrorString

err := fmt.Errorf("new error:[%w]", &ErrorString{s:"target err"})

fmt.Println(errors.As(err, &targetErr))

// output

true

扩展

Is As 两个方法已经预留了口子,可以由自定义的 error struct 实现并覆盖调用。

源码也没什么可说的,太简单了,一眼就能看懂的。

有疑问加站长微信联系(非本文作者)

go 自定义error怎么判断是否相等_Go 1.13 errors 基本用法相关推荐

  1. go 自定义error怎么判断是否相等_Go Web 小技巧(二)GORM 使用自定义类型

    不知道大家在使用 Gorm 的时候,是否有遇到过复杂类型 ( map, struct...) 如何映射到数据库的字段上的问题? 本文分别介绍通过实现通用接口和 Hook 的方式绑定复杂的数据类型. 一 ...

  2. go 自定义error怎么判断是否相等_「GCTT 出品」Go 系列教程——30. 错误处理

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Go 系列教程是非常棒的一套初学者教程,入门就它了. 这是 Golang 系列教程中的第 30 篇.在本章教程中,我们 ...

  3. GO语言-自定义error

    目录 前言 内置包创建错误对象 自定义error接口的实现 前言 error是go语言中的一种数据类型,内置接口.定义了一个方法Error() string error接口 error接口的实现--e ...

  4. Windows 中自定义Error Codes

    Windows 中自定义Error Codes的格式: Bits: 31-30 29 28 27-16 15-0 Contents Severity Microsoft/ customer Reser ...

  5. 自定义error、北京污染物数据处理、可视化

    数据资源已上传在资源库 自定义error.北京污染物数据处理.可视化 README 原始数据说明: 各类污染物都是微克/立方米,但是在计算AQI时CO是使用毫克的 原始数据的格式分布: ['No', ...

  6. php files得不到导入的文件,PHP判断文件是否被引入的方法get_included_files用法示例...

    本文实例讲述了PHP判断文件是否被引入的方法get_included_files用法.分享给大家供大家参考,具体如下: // 本文件是 abc.php include 'test1.php'; inc ...

  7. [error] Vivado代码仿真时错误提示:ERROR: [Common 17-39] ‘launch_simulation‘ failed due to earlier errors.

    仿真错误描述: 作为新手在学习FPGA时的问题,使用Verilog语言在Vivado中编程,在进行仿真时出现错误提示如下: [USF-XSim-62] 'compile' step failed wi ...

  8. Attempting to fetch value instead of handling error Internal: failed to get device attribute 13 for

    Attempting to fetch value instead of handling error Internal: failed to get device attribute 13 for ...

  9. 为什么Go中有的自定义error会导致内存溢出

    分享一个在go tour上看到的练习题,练习里要求用户自己定义一个错误类型,实现error接口,函数在参数不满足条件的时候返回自定义的错误类型的值.练习中特别提示用户不要在实现的Error方法里直接使 ...

最新文章

  1. Laplacian Eigenmaps 拉普拉斯特征映射
  2. 《软件调试分析技术》学习笔记
  3. 【Python】Python库之虚拟现实
  4. Android 来电归属地显示功能demo
  5. 关联分析(一)--Apriori算法
  6. 【技巧】谷歌Chrome浏览器清理缓存的两种方式
  7. B站压片 码率标准 和 码率变化 记录
  8. 万年历我java输出实现_用java实现简单的万年历输出的代码
  9. 《商业银行会计》--概述
  10. Java实现坦克大战小游戏
  11. java excel 密码_Java 加密Excel文件(打开时需输入密码)
  12. PT展揭晓“2021年中国5G实力榜”,亿美软通入围“5G消息企业十强”
  13. 七彩虹将星x15xs 2022款 怎么样
  14. JAVA系统之间通信方式总结
  15. Python爬取网易云音乐评论,反爬算啥啊!
  16. Android 学习记录(持续更新)
  17. Android Framework:深入探索 AIDL 数据流动
  18. FPGA数字信号处理(十三)锁相环位同步技术的实现
  19. 德国风力发电机发电数据集(13w多条数据)
  20. python实训报告pygame_20192423 2019-2020-2 《Python程序设计》实验四报告

热门文章

  1. 微信签名验证踩坑记录1
  2. 字符串排序(C语言实现)
  3. 不争分数之多寡,唯问学问之有无(读《大学该怎么读:给大学生的75封回信》有感)
  4. CoreAnimation6-基于定时器的动画和性能调优
  5. SqlSugar扩展SqlBulkCopy
  6. 资政知识产权:爆款产品如何通过外观设计专利进行保护
  7. 女孩需要富养出来的优雅
  8. TP5框架初步认识微信公众号
  9. 「学习笔记」Vue 官方视频教程 2.0版
  10. Fishing Master(贪心算法)