自学内容网 自学内容网

go recover

package main

import (
"fmt"
)

func main() {
fmt.Println("Calling first function")
firstFunction()

fmt.Println("Calling second function")
secondFunction()

fmt.Println("End of main")
}

func firstFunction() {
defer func() {
recover()
}()
fmt.Println("In first function")
secondFunction()
}

func secondFunction() {
fmt.Println("In second function")
panic("panic in secondFunction")
}

在second中发生panic,second中没有defer,故立即退出,panic沿着调用栈传递到first中,first因为调用的second函数发生panic,也应该退出,但是由于first中有recover,故执行defer的recover,捕获了这个panic,使得它不会再沿着调用栈传到main中。因此,first函数退出后,main函数得以继续往下执行,所以会输出“Calling second function"。但是main随后调用second,又发生panic,panic沿着调用栈传递到main中,导致main退出,不会输出”End of main“


原文地址:https://blog.csdn.net/bonfirelit/article/details/140507470

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!