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)!