1创建一个被包装的 error
err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)
fmt.Println(err3)
2. 拆开一个被包装的 error
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 是否是包含指定错误
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. 提取指定类型的错误或类型断言
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
实例:
package main
import "fmt"
import "errors"
type ErrorString struct {
s string
}
func (e *ErrorString) Error() string {
return e.s
}
func main() {
e := errors.New("原始错误e")
w := fmt.Errorf("Wrap了一个错误%w", e)//加了一个%w来生成一个可以Wrapping Error,err赋值给e,
fmt.Println(errors.Unwrap(w))//返回e
fmt.Println(errors.Is(w,e))//Is用以判断嵌套情况下的两个error是否包含,func Is(err, target error) bool,如果err和target是同一个或err 是一个wrap error,target也包含在这个嵌套error链中的话,那么也返回true
//在Go 1.13之前没有wrapping error的时候,我们要把error转为另外一个error,一般都是使用type assertion 或者 type switch,其实也就是类型断言
//但是对于前提的方式,上述方式就不能用了,所以Golang为我们在errors包里提供了As函数。用于error的类型断言
var targetErr *ErrorString
err := fmt.Errorf("new error:[%w]", &ErrorString{s:"target err"})
fmt.Println(errors.As(err, &targetErr))
}