Go 通过使用 recover 内置函数,可以从 panic 中 恢复recover 。 recover 可以阻止 panic 中止程序,并让它继续执行。

在这样的例子中很有用:当其中一个客户端连接出现严重错误,服务器不希望崩溃。 相反,服务器希望关闭该连接并继续为其他的客户端提供服务。 实际上,这就是Go的 net/http 包默认对于 HTTP 服务器的处理。

 

package main

import "fmt"

// 这是一个 panic 函数
func mayPanic() {
    panic("a problem")
}

func main() {

// 必须在 defer 函数中调用 recover。 当跳出引发 panic 的函数时,defer 会被激活, 其中的 recover 会捕获 panic。
    defer func() {

// recover 的返回值是在调用 panic 时抛出的错误。
        if r := recover(); r != nil {

            fmt.Println("Recovered. Error:\n", r)
        }
    }()

    mayPanic()

// 这行代码不会执行,因为 mayPanic 函数会调用 panic。 main 程序的执行在 panic 点停止,并在继续处理完 defer 后结束。
    fmt.Println("After mayPanic()")
}

 

Recovered. Error:
 a problem

 

原创文章,转载请注明出处:http://www.nwumba.cn/article/83/