我们都知道error用处特别多,但是golang官方提供的error类型功能实在太单一了,只能打印错误提示字符串。不过在Go1.13版本后对error功能进行了增强,也就是今天要提到的error wrapping。
error wrapping的原理非常简单,通过fmt.Errorf + %w的组合生成一个嵌套的error。通过多次调用生成多层嵌套error。
同时errors包还提供了三个好用的函数,全列在下面的图里。
最后我写了个demo测试了一下,确实很好用:
type MyError struct {
s string
code int
}
func NewMyError(s string, code int) MyError {
return MyError{s, code}
}
func (me MyError) Error() string {
return me.s
}
func (me MyError) Code() int {
return me.code
}
func main() {
myErr := NewMyError("not found", 404)
wrapp1Err := fmt.Errorf("this is a wrapping1 error:%w", myErr)
wrapp2Err := fmt.Errorf("this is a wrapping2 error:%w", wrapp1Err)
fmt.Println(errors.Unwrap(wrapp2Err))
fmt.Println(errors.Is(wrapp2Err, myErr))
if target,ok := wrapp2Err.(MyError); ok {
fmt.Println("type assert success:",target.Error())
}
var target MyError
if errors.As(wrapp2Err, &target) {
fmt.Println("as success:",target.Code())
}
}
(全文完)
参考链接: