这是我参与更文挑战的第6天,活动详情查看: 更文挑战
Go语言中,错误是可以预期的。通过返回错误给调用者的方法,让调用者决定怎么处理。
三种方式处理错误:error ,deferred,panic
error接口
内置error接口
Go语言中内置的error接口,在只有一个Error方法,返回错误信息
type error interface{
ERROR() string
}
// demo
i,err := strconv.Atoi("a")
strconv.Atoi() 功能是字符串转整型,demo中a无法转成int,将会输出错误,并且是第二个返回值。
errors.New自定义错误信息
errors.New("自定义错误信息") 函数生成错误信息返回给调用者
自定义error
当使用errors.New只能传递一个字符串,且只能传递字符串类型,无法满足你的需求时可以通过自定义error来满足自己的需求
自定义错误结构体,实现error接口
type errReturn struct{
code int
msg string
}
func (errR errReturn) Error() string{
return errR.errorMsg
}
错误嵌套
嵌套error
Go 1.13版本,新增了Error Wrapping功能,可以基于一个存在的error生成新的error,并保留原error的信息
e:=errors.New("原始错误信息e")
w:=fmt.Errorf("wrap一个错误:%w",e)
fmt.Println(w)
解开嵌套error
嵌套的error也可以被解开,通过使用errors.Unwrap函数
errors.Unwrap(w)
错误函数判断和转换
- errors.Is函数:判断error是否是同一个
- errors.As函数:重写
deferred 函数
defer 关键字用于修饰一个函数或者方法,使得函数或者方法在返回前才会被执行,即延迟处理,但一定会执行
常用的场景成对的操作,比如,文件的打开和关闭,加锁和释放锁,建立连接和释放连接
panic异常
Go是静态强类型语言,很多错误尽可能在编译时捕获,但也会发现一些运行时发生的问题就会引起panic异常
panic异常会让程序中断运行,使得程序崩溃,所以对于普通错误使用error,而不是panic
panic是Go的内置函数,可以接受interface{}类型的参数,即任何类型都可以当做panic的参数
func panic(v interface{})
recover捕获panic异常
如果在panic异常发生时会使得程序停止,但在有时需要在程序崩溃前对一些资源做释放,那么需要在panic异常中恢复,才能进行处理。
recover函数恢复panic异常
使用方法 : defer+匿名函数+recover函数。其中,recover函数返回的值就是通过panic函数传递的参数值
func main(){
defer func(){
if p:=recover();p!=nil{
fmt.Println(p)
}
}()
// ...
}