Closed alpha-baby closed 5 years ago
@EDDYCJY
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...")
}
大致是这样的一个设计思想,有问题欢迎讨论指正...
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 会和函数栈有关系,以前没有注意过这个问题。
@alpha-baby 可以看看文章的这一块内容:https://book.eddycjy.com/golang/panic/panic-and-recover.html#%E6%81%A2%E5%A4%8D-recover ,虽然我在文中没有明确指出这种现象,但是里面的知识点与造成你这个疑问的根本原因是有关的。
@xiye518 👍
@alpha-baby 可以看看文章的这一块内容:https://book.eddycjy.com/golang/panic/panic-and-recover.html#%E6%81%A2%E5%A4%8D-recover ,虽然我在文中没有明确指出这种现象,但是里面的知识点与造成你这个疑问的根本原因是有关的。
@xiye518 👍
ok 感谢,感谢
https://github.com/developer-learning/reading-go/issues/199#issuecomment-526117181 大佬可以有空的时候看看吗,不知道这个是为什么,有空可以解答解答,感谢了。