Go 示例: 恢复

Go 允许使用内置函数 recover 从恐慌中恢复recover 可以阻止 panic 终止程序,并让程序继续执行。

这在以下情况下非常有用:如果一个客户端连接出现严重错误,服务器不希望崩溃。相反,服务器希望关闭该连接并继续为其他客户端提供服务。事实上,这就是 Go 的 net/http 对 HTTP 服务器的默认行为。

package main
import "fmt"

此函数会引发恐慌。

func mayPanic() {
    panic("a problem")
}

recover 必须在延迟函数中调用。当封闭函数引发恐慌时,延迟函数将被激活,其中的 recover 调用将捕获恐慌。

func main() {

recover 的返回值是调用 panic 时引发的错误。

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()
    mayPanic()

此代码不会运行,因为 mayPanic 会引发恐慌。main 的执行在恐慌发生的地方停止,并在延迟闭包中恢复。

    fmt.Println("After mayPanic()")
}
$ go run recover.go
Recovered. Error:
 a problem

下一个示例:字符串函数.