Skip to content

Recover

Go 通过使用 recover 内置函数,可以从 panic 中 恢复recoverrecover 可以阻止 panic 中止程序,并让它继续执行。\n 在这样的例子中很有用:当其中一个客户端连接出现严重错误,服务器不希望崩溃。 相反,服务器希望关闭该连接并继续为其他的客户端提供服务。 实际上,这就是Go的 net/http 包默认对于 HTTP 服务器的处理。

代码示例

package main

import "fmt"

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

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

    // recover 的返回值是在调用 panic 时抛出的错误。
    defer func() {
        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