go语言中异常处理 defer、panic、recover

原创
2014/05/23 16:47
阅读数 734
defer是在函数最后执行,相当于析构函数。比如

func test() {
	fmt.Println("fefer执行的")
}
func main() {
	defer test()
	fmt.Println("这一句先执行,在函数最后执行defer")
}



我们看到在main函数中不管defer在哪一行,都是最后执行的,理解为析构函数算了

panic 终止执行,抛出错误,在panic后,下面的代码不执行了,直接去执行defer的代码,然后defer里的recover可以捕获错误

recover 接收panic抛出的错误,都是放到defer中捕获错误的,下面来个小例子

func gotest() {
	fmt.Println("aaa")
	if err := recover(); err != nil {
		fmt.Println(err)
	}
	fmt.Println("xxx")
}

//用户登陆
func (this *UserController) Login() {
	defer gotest()
	fmt.Println("...")
	panic("抛出错误")
	fmt.Println("在panic后面的不显示")
}



我们访问用户登陆方法 Login时,首先每行是defer gotest(),表示析构函数是gotest(),最后执行
然后看第二行输出...这个应该是最先执行的
第三行遇到了panic("抛出错误"),这里后面的就不执行了,到此停止,去执行析构函数gotest(),

然后在gotest函数中第一行打印fmt.Println("aaa")
第二行发现了recover,这里recover可以捕获到panic中的错误,如果捕获到就打印fmt.Println(err)

嘿嘿,看来挺容易理解的嘛,还有一点要注意的是,recover中有在defer中才能捕获错误,还有一点就是,如果有多个defer的话,是最后一个先执行,倒序执行


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
4 收藏
0
分享
返回顶部
顶部