阅读 92

Go篇|错误处理

这是我参与更文挑战的第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)
        }
    }()
    
   // ...
}
复制代码
文章分类
后端
文章标签