Golang学习笔记十七

资源管理与错误处理-panic与recover

Posted by CDz on February 16, 2019

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😁