Golang recover无法捕获踩坑

首先程序发生panic后,程序不会往下继续执行,也不会立即结束而是会调用当前goroutine 的延迟调用函数。因此,要是兜住recover就必须加在当前goroutine 的 延迟调用函数中。

  • recoverpanic必须在同一个goroutine中
  • recover必须放到延迟执行函数defer中
  • recover必须和panic只差一个函数帧,具体情形如下代码:
func test() {

        defer func() {
                fmt.Println("5555", recover()) //有效,但是已经recover的panic 不能重复recover
        }()
        defer a("4444") // 有效
        defer func() {
                a("3333") //无效
        }()
        defer fmt.Println("2222", recover()) //无效
        defer func() {
                func() {
                        fmt.Println("1111", recover()) //无效
                }()
        }()

        panic("test panic")
}

func a(str string) {
        err := recover()
        fmt.Println(str, err)
}

你可能感兴趣的:(Golang,golang,panic,recover,go)