在线文档 > 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