🤔为什么我的 panic 逃跑了

func action(){
  defer func() {
        if r := recover(); r != nil {
            log.Println("get panic",r)
        }
    }()
  go func(){
    time.Sleep(time.Second*10)
    panic(1)
  }()
  fmt.Println("end")
}

可以这样理解,go的代码和 action 已经是两个世界的东西了。所以即使在主进程也无法捕获。从另一个方面来说,这个方法的 defer 早就已经执行结束了。在fmt.Println("end")后,就已经执行。所以如果要捕获这个 panic 要在他的父函数或者本函数,而不是主进程。

本作品采用《CC 协议》,转载必须注明作者和本文链接
biubiubiu
讨论数量: 2

panic之后会执行当前goroutine下的所有defer

1年前 评论
space2020 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!