panic用于表示程序无法继续运行的严重错误

panic使用defer + recover()函数进行捕获, recover只能在defer调用的函数中生效

recover只能捕获同一个goroutinue的panic

1
2
3
4
5
6
7
8
9
10
11
12
func main() {

defer func() {
fmt.Println(recover())
}()

go func() {
panic("goroutine panic")
}()

select {}
}

这里就捕获不到gouroutinue panic这个错误
原因就是recover在main, 而panic发生在别的goroutinue

这样就可以捕获

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func run() {

defer func() {
if err := recover(); err != nil {
fmt.Println("recover:", err)
}
}()

panic("worker error")
}

func main() {

go run()

select {}
}

能恢复, 处理的问题使用error, 程序状态出现了问题不能继续, 使用panic

  • 用户输入非法参数

  • 文件不存在

  • 网络失败
    这些都是常见的问题, 不代表程序不能使用, 应该用error

  • 程序启动时出现错误

  • 初始化出现错误

  • 返回了不可能发生的状态
    panic

recover在panic发生后去捕获panic, 放在defer里面我觉得是保证一定能执行, 如果panic了, 不使用defer, 后面的recover就不能运行, 所以要用defer来保证,