Go入门29:错误处理之 defer

Go语言中引入关键字defer来延迟执行defer后面的函数。

一直等到包含defer语句的函数执行完毕时,延迟函数(defer后的函数)才会被执行,而不管包含defer语句的函数是通过return的正常结束,还是由于panic导致的异常结束。

你可以在一个函数中执行多条defer语句,它们的执行顺序与声明顺序相反

defer简介

在Go语言中,可以使用关键字defer向函数注册退出调用,即主调函数退出时,defer后的函数才会被调用。

defer语句的作用是:不管程序是否出现异常,均在函数退出时自动执行相关代码(相当于Java中的finally)。当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回。

在处理异常时候这个特点很有用处:有defer关键字之后,即便函数抛出了异常,也会被执行,这样就不会因程序出现了错误而导致资源不会释放了。

func main() {

    for i := 0; i < 5; i++ {

        defer fmt.Printf(“%d “,i)

    }

}

输出是:4 3 2 1 0。

执行 recover

被 defer 的函数在 return 之后执行,这个时机点正好可以捕获函数抛出的 panic,因而 defer 的另一个重要用途就是执行 recover。

recover 只有在 defer 中使用才更有意义,如果在其他地方使用,由于程序已经调用结束而提前返回而无法有效捕捉错误。

当多个 panic 抛出异常是, recover 接收第一个 panic 抛出的异常。

func main() {

    defer func() {

        if ok := recover(); ok != nil {

            fmt.Println(“recover”)

        }

        fmt.Println(“AAA”)

    }()

    fmt.Println(“error1”)

    panic(“error”)

    fmt.Println(“error2”)

}

输出:

error1

AAA

recover

    原文作者:laigw
    原文地址: https://www.jianshu.com/p/1ae56e58477e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞