func test_1(){exit:=make(chan struct{})
go func() {
defer close(exit)
defer println("exit") func(){
defer func() {
println("b:",recover()==nil,recover())
}() func (){
println("c") //runtime.Goexit()
panic("panic done")
println("c done")
}()
println("b done")
}()
println("a done")
}()
<-exit}调用panic后会结束后续的流程,defer可以继续执行,但是println("a done")还是输出了了结果,照理来说panic调用后这部分应该也不能输出的为啥能输出“a done”?
1 回答
有只小跳蛙
TA贡献1824条经验 获得超8个赞
使用了recover从恐慌中恢复,而且恢复恐慌的defer被嵌套在内部匿名函数里面了,你可以把这一部分看成是调用的另一个函数,defer会在panic之后执行,由于恢复了恐慌,自然不会影响a done 的输出
- 1 回答
- 0 关注
- 881 浏览
添加回答
举报
0/150
提交
取消