栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

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

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

错误处理是每个编程语言都要考虑的一个重要话题。看看赖思怎么给甜甜讲解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() {
    // 无法捕获异常
    defer recover()
    panic(1)
}

 

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

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


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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/945547.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号