Go 通过使用 recover 内置函数,可以从 panic 中 恢复recover 。
recover 可以阻止 panic 中止程序,并让它继续执行。
|
|
在这样的例子中很有用:当其中一个客户端连接出现严重错误,服务器不希望崩溃。
相反,服务器希望关闭该连接并继续为其他的客户端提供服务。
实际上,这就是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()")
}
|