漫画Go语言中的错误处理/异常捕获

kep-w · · 1250 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

赖思与甜甜,有趣有料有温度,技术学习有思路!

错误处理是每个编程语言都要考虑的一个重要话题。 看看赖思怎么给甜甜讲解Go语言的错误处理吧!

外层Marshal函数作用是进行json编码并返回。

marshal函数在开始遇到defer, 会将其后要延迟执行的方法“压栈”;当defer被触发时,再将所有“压栈”的方法“出栈”并执行。

如果这个流程中没有异常,会在return后且程序返回前,触发derfer。而recover函数的返回值是nil,所以err是nil;

而当函数执行出现了异常,函数将停止执行后续的语句,触发defer,recover被执行,它可以捕获触发panic时的参数,进行异常处理,使程序恢复到正常的执行流程。

func main() {
	if r := recover(); r != nil {
		fmt.Println(r)
	}

	panic("throw an error")

	if r := recover(); r != nil {
		fmt.Println(r)
	}
}

第一个recover调用执行时,函数没有异常,这时recover调用将返回nil。

而当panic发生时,第二个recover调用将没有机会被执行到。所以在非defer语句中执行recover没有任何效果。

还有一点需要注意,必须在defer函数中直接调用recover。来看这个例子:

func main() {
	//defer1
	defer func() {
		//defer2
		defer func() {
			if r := recover(); r != nil {
				fmt.Println(r)
			}
		}()
	}()
	panic(1)
}

在2层嵌套的defer函数中调用recover,实际调用到recover,是经过了两个函数。而defer2对应的上一级执行环境中,没有异常信息,所以捕获不到。

func main() {
	//defer1
	defer func() {
		//defer2
		defer func() {
			if r := recover(); r != nil {
				fmt.Println(r)
			}
		}()
	}()
	panic(1)
}

而defer语句直接调用recover函数,依然不能正常捕获异常。因为recover和异常信息处于同一级执行环境中。

也就是说,recover能捕获的是上一级执行环境中出现的异常。

有趣有料有温度,和我一起学技术!

欢迎关注公众号 来思Go,收看更多赖思与甜甜的技术学习日常。

 


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1250 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传