这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
这篇笔记主要是介绍Go语言的错误处理的内容,接下来让我们开始吧
前言
Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…catch…finally 这种处理。
Go 中引入的错误处理方式为:defer, panic, recover,也仅仅是错误处理的模拟。
在Go语言中会使用多值返回来返回错误。这种检查错误的方式给程序员提供了很大的控制权。
1、error
go语言的错误,纵观全局就是error接口,只要实现了Error()string方法的任何类型,都属于错误。
定义如下:
type error interface {
Error() string
}
2、errors包
go语言提供了基础的errors包,errorString结构变量,提实现了上述接口。 New方法用来实例一个error对象。 Error方法,返回具体的错误内容
func New(text string) error {
return &errorString{text}
}
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
问题:为什么返回errorString指针,而不是具体对象呢?
在go工程项目中,大量使用errors包,如果恰好碰到错误内容相同的error,返回具体对象的话,会被认为是同一个错误,但实际上是两个错误。所以用指针规避。
3、扩展,其他语言错误处理
和try-cache,exception对比,go的error处理更加细化,每一步的error都得到精准处理,而不是cache到一大段代码的exception。 付出的代价就是大量的(if err!= nil)的卫述语句。
4、panic,recover
error处理,类似于程序运行异常的描述,并不能在发现严重错误的时候退出执行。所以引入了panic,panic(errString)表示退出程序运行。
panic程序的时候,可以用recover兜底,也就是说程序panic掉的时候,会先执行提前注册的recover方法,然后退出执行,用来做一些关闭连接,兜底工作的。
正常情况下,尽量不要用recover做程序恢复panic的逻辑,遵循设计者的初衷,panic,就是让你的程序死掉。
示例如下:
func main() {
defer func() {
if recover()!=nil{
test()
}
}()
fmt.Println("马上让程序死掉")
panic("哈哈,你死定了")
}
func test(){
fmt.Println("死之前关掉数据库连接")
panic("死也瞑目了")
}
总结:
Go语言虽然没有一个较为成熟的异常捕获机制,但是其精简的错误处理仍旧能够满足其需求,减少错误的处理大大的加快了我们的开发效率,代码的运行效率。