一个挺有趣的小例子
package main
import "fmt"
func a() {
defer b()
fmt.Println("a")
}
func b() {
defer c()
panic("b")
}
func c() {
defer catchPanic("f")
defer f()
panic("c")
}
func f() {
panic("f")
}
func catchPanic(funcname string) {
if err := recover(); err != nil {
fmt.Println(funcname, "recover :", err)
}
}
func main() {
a()
}
// output:
a
f recover : f
panic: b
goroutine 1 [running]:
main.b()
/Users/jace/go/src/hello/defer/panic.go:12 +0x54
main.a()
/Users/jace/go/src/hello/defer/panic.go:8 +0x90
main.main()
/Users/jace/go/src/hello/defer/panic.go:32 +0x20
Process finished with the exit code 2