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()")
}
|