panic
n. 恐慌,惊慌;大恐慌 adj. 恐慌的;没有理由的 vt. 使恐慌 vi. 十分惊慌
从中文解释可知这是一个非常严重的词语.在之前的程序中,我们对于错误的处理很多使用的panic,一旦遇到panic程序就会自动挂掉,这其实是我们不愿意看到.在Java中我们知道对于一个错误的处理,通常使用try-catch-finally,这样的结构处理,保证程序不会挂掉.
但是,panic在退出程序前会先执行defer,如果可以在defer中得到程序是否panic,且将panic处理掉,不向上抛出,那么岂不是就可以处理错误信息了.
recover
vt. 恢复;弥补;重新获得 vi. 恢复;胜诉;重新得球 n. 还原至预备姿势
这是GO语言内置函数,可以捕捉程序异常.上面提到,程序panic之后,会先执行defer,在这里对错误捕捉就可以完美形成错误处理的闭环.
查看函数recover:func recover() interface{}
返回的是一个interface{}也就是任何类型,为什么是任何类型而不是error类型呢?查看func panic(v interface{})
panic函数可知,是因为panic可以传入任何类型。
所以我们使用前面所学的 type assertion判断类型.
下面展示recover用法:
package main
import (
"errors"
"log"
)
func tryRecover() {
defer func() {
r := recover()
if e,ok := r.(error); ok {
log.Println(e)
}
}()
panic(errors.New("recover错误处理演示"))
}
func main() {
tryRecover()
}
总结
- panic
- 停止当前函数执行(HTTPserver中没有终止,是因为server内部recover了)
- 一直向上返回.执行每一层的defer
- 如果没有遇见recover,程序退出
- recover
- 仅在defer调用时执行
- 获取panic的值
- 如果无法处理,可以重新panic
作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star😁