Go1.13 errors包用法
go 1.13 加入了 errors 包,主要有:
- As
- Is
- New
- Unwrap
定义
As(err error, target interface{}) bool
在err的链中找到与目标匹配的第一个错误,如果有则返回true,否则返回false
Is(err error, target error) bool
判断两个error是否相等
New(text string) error
返回一个新的error对象,即使内容一样也是两个不同的对象
Unwarp(err error) error
如果传入的err对象中有
%w
关键字的格式化类容,则会在返回值中解析出这个原始error,多层嵌套只返回第一个,否则返回nil
示例代码
package main
import (
"errors"
"fmt"
"os"
)
func main() {
// As
fmt.Println("-------As--------")
if _, err := os.Open("non-existing"); err != nil {
var pathError *os.PathError
if errors.As(err, &pathError) {
fmt.Println("Failed at path:", pathError.Path)
} else {
fmt.Println(err)
}
}
// New
fmt.Println("-------New--------")
err1 := errors.New("error1")
err2 := errors.New("error2")
// Is
fmt.Println("-------Is--------")
fmt.Println(errors.Is(err1, err2))
fmt.Println(errors.Is(err1, errors.New("error1")))
// Unwrap
fmt.Println("-------Unwrap--------")
e := errors.New("e")
e1 := fmt.Errorf("e1: %w", e)
e2 := fmt.Errorf("e2: %w", e1)
fmt.Println(e2)
fmt.Println(errors.Unwrap(e2))
fmt.Println(e1)
fmt.Println(errors.Unwrap(e1))
}
执行结果:
# champly @ champlydeiMac in ~/go/src/demo/error [10:06:10]
$ go run errors.go
-------As--------
Failed at path: non-existing
-------New--------
-------Is--------
false
false
-------Unwrap--------
e2: e1: e
e1: e
e1: e
e