相较于Java中的try/catch结构,各种捕获,各种错误类型,在Go中,它只是把错误当成一种值来处理,强调判断错误,处理错误,相对于Java中的抛出异常,Go语言中的错误处理更具有实用性,也有可能是我学艺不精,只是一个片面的理解,接下来,对Go中的错误处理做一个简短的总结,便利于之后使用
当一个函数或方法需要返回错误时,通常将错误作为最后一个返回值,例子如下:
func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}
error是一个接口类型,默认零值为nil,所以说,当我们要判断一个程序是否发生了error,我们就将返回的错误与nil进行比较,我们经常使用以下的代码:
file, err := os.Open("./xx.go")
if err != nil {
fmt.Println("打开文件失败,err:", err)
return
}
在一些理解中,对于文件的读入,读出,增删改查等一类操作都需要进行错误判断。
fmt.Errof
需要经常使用的一个函数,当我们需要知道格式化的错误描述信息时,我们就要使用这个函数进行
例如:
fmt.Errorf("查询数据库失败,err:%v", err)
这个函数我们得到的仅仅是我们包装之后的错误类型,当然,并不能排除其它的错误类型没有发生
所以,为了不丢失函数调用的错误全部类型,我们需要在使用fmt.Error的时候使用%w格式化进行修饰,实现基于已有的错误再包装一个得到的新的错误
fmt.Errorf("查询数据库失败,err:%w", err)
对于二次包装的错误,errors包还有其它三种方法
Unwarp:获得err包含下一层错误
Is:判断err是否包含target
As:判断err是否为target类型
func Unwrap(err error) error // 获得err包含下一层错误
func Is(err, target error) bool // 判断err是否包含target
func As(err error, target interface{}) bool // 判断err是否为target类型