一、 recover() 函数简介
其原型为:
func recover() interface{}
如同Java或者C#等语言中的 try/cache
一样。recover()
函数用于处理 golang 中的 panic 。
二、 用法
如果不用 recover() 将导致程序异常退出,如下:
package main
func doSomething() {
panic("Error: xxxx")
}
func main() {
doSomething()
}
输出:
panic: Error: xxxx
goroutine 1 [running]:
main.doSomething(...)
/temp/main.go:4
main.main()
/temp/main.go:8 +0x27
exit status 2
如果使用了 recover() 处理 panic,则程序会正常结束:
package main
import "fmt"
func handlePanic() {
if err := recover(); err != nil {
fmt.Println("Handle Panic: ", err)
}
}
func doSomething() {
defer handlePanic()
panic("Error: xxxx")
}
func main() {
doSomething()
}
输出:
Handle Panic: Error: xxxx
三、 要点
recover()
函数必须在 defer 标记的方法中调用。如果直接调用或者不在 defer 标记的方法中运行,则recover()
函数不会阻止panic的传递,而进一步导致程序异常结束。recover()
只能处理同一个协程(goroutine)中抛出的 painc (子协程也不行)。如果需要捕获所有panic,则需要在每一个协程中使用recover()
。- 如果想要观察堆栈信息的话,可以使用
debug.PrintStack()
输出堆栈信息。