赖思与甜甜,有趣有料有温度,技术学习有思路!
错误处理是每个编程语言都要考虑的一个重要话题。看看赖思怎么给甜甜讲解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,收看更多赖思与甜甜的技术学习日常。
有疑问加站长微信联系(非本文作者)