一、子协程的panic,只能在子协程中处理
下面的代码,main 函数 无法获取panic
package main
import (
"fmt"
"time"
)
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
go test()
time.Sleep(time.Second)
}
func test() {
test1()
}
func test1() {
panic("我错了")
}
二、子协程处理panic
package main
import (
"fmt"
"time"
)
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
go test()
time.Sleep(time.Second)
}
func test() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
test1()
}
func test1() {
panic("我错了")
}
三、一个协程中才能后获取panic,最上层的能够获取下面的panic
如下代码main函数可以获取test1 函数中的panic
package main
import (
"fmt"
)
func main() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
test()
}
func test() {
defer func() {
if e := recover(); e != nil {
fmt.Println(e)
}
}()
test1()
}
func test1() {
panic("我错了")
}
关于recover 获取panic的原则
1、recover 只能获取同协程内的panic
2、defer 获取recover 只能在直接func 内获取,不能再跨一个func
3、panic(err) err != nil