eddycjy / blog

煎鱼的博客,有点忙,传送门:https://eddycjy.com
3.05k stars 431 forks source link

panic recover 捕获的问题 #45

Closed alpha-baby closed 5 years ago

alpha-baby commented 5 years ago

https://github.com/developer-learning/reading-go/issues/199#issuecomment-526117181 大佬可以有空的时候看看吗,不知道这个是为什么,有空可以解答解答,感谢了。

alpha-baby commented 5 years ago

@EDDYCJY

xiye520 commented 5 years ago

golang的recover只能捕获它上一层函数栈的panic,这是golang设计recover的机制,示例如下:

func test1() {
    // recover不能捕获当前的panic
    go func() {
        defer recover() // recover和panic在同一层级的函数栈

        panic("panic here..")
    }()

    time.Sleep(time.Second)
    fmt.Println("main quit...")
}

func test2() {
    // recover能捕获当前的panic
    go func() {
        defer func() { // 将recover压到了下一层级的函数栈
            if err := recover(); err != nil {
                fmt.Printf("recover err: %s\n", err)
            }
        }()

        panic("panic here..")
    }()

    time.Sleep(time.Second)
    fmt.Println("main quit...")
}

大致是这样的一个设计思想,有问题欢迎讨论指正...

alpha-baby commented 5 years ago

golang的recover只能捕获它上一层函数栈的panic,这是golang设计recover的机制,示例如下:

func test1() {
  // recover不能捕获当前的panic
  go func() {
      defer recover() // recover和panic在同一层级的函数栈

      panic("panic here..")
  }()

  time.Sleep(time.Second)
  fmt.Println("main quit...")
}

func test2() {
  // recover能捕获当前的panic
  go func() {
      defer func() { // 将recover压到了下一层级的函数栈
          if err := recover(); err != nil {
              fmt.Printf("recover err: %s\n", err)
          }
      }()

      panic("panic here..")
  }()

  time.Sleep(time.Second)
  fmt.Println("main quit...")
}

大致是这样的一个设计思想,有问题欢迎讨论指正...

我觉得是这样的,recover 会和函数栈有关系,以前没有注意过这个问题。

eddycjy commented 5 years ago

@alpha-baby 可以看看文章的这一块内容:https://book.eddycjy.com/golang/panic/panic-and-recover.html#%E6%81%A2%E5%A4%8D-recover ,虽然我在文中没有明确指出这种现象,但是里面的知识点与造成你这个疑问的根本原因是有关的。

@xiye518 👍

alpha-baby commented 5 years ago

@alpha-baby 可以看看文章的这一块内容:https://book.eddycjy.com/golang/panic/panic-and-recover.html#%E6%81%A2%E5%A4%8D-recover ,虽然我在文中没有明确指出这种现象,但是里面的知识点与造成你这个疑问的根本原因是有关的。

@xiye518 👍

ok 感谢,感谢