Bootstrap

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“

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;