Go语言的错误处理 | 青训营笔记

257 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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语言虽然没有一个较为成熟的异常捕获机制,但是其精简的错误处理仍旧能够满足其需求,减少错误的处理大大的加快了我们的开发效率,代码的运行效率。