赞
踩
2019.09.03日,Golang 1.13版本发布,这次更新算是比较大的了,有大家期待的GOPROXY和GOPRIVATE等,具体的可以去看这个版本的 Go 1.13 Release Notes。
Go 1.13发布的功能还有一个值得深入研究的,就是对Error的增强,也是今天我们要分析的 Error Wrapping.
做Go语言开发的,肯定经常用error
,但是我们也知道error
非常弱,只能自带一串文本其他什么都做不了,比如给已经存在的error
增加一些附加文本,增加堆栈信息等都做不了。如果我们想给error
增加一些附加文本怎么做呢?有两种办法:
第一种:
newErr:=fmt.Errorf("数据上传问题: %v", err)
通过fmt.Errorf
函数,基于已经存在的err
再生成一个新的newErr
,然后附加上我们想添加的文本信息。这种办法比较方便,但是问题也很明显,我们丢失了原来的err
,因为它已经被我们的fmt.Errorf
函数转成一个新的字符串了。
第二种:
- func main() {
- newErr := MyError{err, "数据上传问题"}}type MyError struct {
- err error msg string}func (e *MyError) Error() string {
- return e.err.Error() + e.msg}
这种方式就是我们自定义自己的struct
,添加用于存储我们需要额外信息的字段,我这里是err
和msg
,分别存储原始err
和新附加的出错信息。然后这个MyError
还会实现error
接口,表示他是一个error
,这样我们就可以自由的使用了。
这种方式有点很明显,大家可以看到了。缺点呢,就是我们要自定义很多struct
,而且我们自己定义的,和第三方的可能还不太一样,无法统一和兼容。基于这个背景,Golang 1.13 为我们提供了Error Wrapping,翻译过来我更愿意叫Error嵌套。
Error Wrapping,顾名思义,就是为我们提供了,可以一个error
嵌套另一个error
功能,好处就是我们可以根据嵌套的error
序列,生成一个error
错误跟踪链,也可以理解为错误堆栈信息,这样可以便于我们跟踪调试,哪些错误引起了什么问题,根本的问题原因在哪里。
因为error
可以嵌套,所以每次嵌套的时候,我们都可以提供新的错误信息,并且保留原来的error
。现在我们看下如何生成一个嵌套的error
。
e := errors.New("原始错误e")w := fmt.Errorf("Wrap了一个错误%w", e)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。