panic

  • panic 只会触发当前 Goroutine 的延迟函数调用;
  • recover 只有在 defer 函数中调用才会生效;
  • panic 允许在 defer 中嵌套多次调用;
  • panic 之后的代码一定不会执行;

最简单的一个示例,panic 会被 defer 中的 recover 正确捕获,并且程序不会异常退出,而且会继续执行 recover 之后的代码,但是就算捕获到了 panic,在 panic 之后的代码也不会被执行。

func main() {
    defer func() {
        fmt.Println("recover...", recover())
        fmt.Println("after recover...")
    }()

    panic("panic...")
    fmt.Println("after panic...")
}

$ go run main.go
recover... panic...
after recover...