Recover

Recover #

// Go 通过使用 `recover` 内置函数,可以从 panic 中 _恢复recover_ 。
// `recover` 可以阻止 `panic` 中止程序,并让它继续执行。

// 在这样的例子中很有用:当其中一个客户端连接出现严重错误,服务器不希望崩溃。
// 相反,服务器希望关闭该连接并继续为其他的客户端提供服务。
// 实际上,这就是Go的 `net/http` 包默认对于 HTTP 服务器的处理。

package main

import "fmt"

// 这是一个 panic 函数
func mayPanic() {
	panic("a problem")
}

func main() {
	// 必须在 defer 函数中调用 `recover`。
	// 当跳出引发 panic 的函数时,defer 会被激活,
	// 其中的 `recover` 会捕获 `panic`。
	defer func() {
		if r := recover(); r != nil {
			// `recover` 的返回值是在调用 `panic` 时抛出的错误。
			fmt.Println("Recovered. Error:\n", r)
		}
	}()

	mayPanic()

	// 这行代码不会执行,因为 mayPanic 函数会调用 `panic`。
	// `main` 程序的执行在 `panic` 点停止,并在继续处理完 `defer` 后结束。
	fmt.Println("After mayPanic()")
}
Recovered. Error:
 a problem