在线文档  >   Golang练习   >   Recover

Go 提供了使用内置的 recover 函数从 panic中恢复的机制。recover 能够阻止 panic 导致程序崩溃,并让程序继续执行。

一个示例,当服务端遇到一个客户端连接出现严重错误时,服务端并不希望崩溃。相反,服务端会关闭那个客户端连接,并继续为其他客户端提供服务。事实上,Go 的 net/http 默认就是这样处理 HTTP 服务器的。

package main

import "fmt"

// 这个函数会引发 panic。
func mayPanic() {
    panic("a problem")
}

func main() {
    // recover 必须在延迟函数中调用。
    // 当所在函数发生 panic 时,延迟将会激活,
    // recover 调用将捕获 panic。
    defer func() {
        if r := recover(); r != nil {
            // The return value of `recover` is the error raised in
            // the call to `panic`.
            fmt.Println("Recovered. Error:\n", r)
        }
    }()

    mayPanic()

    // 这行代码不会被执行,因为 `mayPanic` 会发生 panic。
    // `main` 函数的执行会在发生 panic 的位置停止,
    // 并在延迟函数中恢复执行。
    fmt.Println("After mayPanic()")
}

运行结果如下:

$ go run recover.go
Recovered. Error:
 a problem