所以,我一直在摆弄围棋,我发现下面的功能恢复成功
package main
import (
"fmt"
)
func a() {
defer func(){
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}()
n := []int{5, 7, 4}
fmt.Println(n[3])
fmt.Println("normally returned from a")
}
func main() {
a()
fmt.Println("normally returned from main")
}
但这不是
package main
import (
"fmt"
)
func r() {
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}
func a() {
defer func(){
r()
}()
n := []int{5, 7, 4}
fmt.Println(n[3])
fmt.Println("normally returned from a")
}
func main() {
a()
fmt.Println("normally returned from main")
}
有人能解释一下为什么吗?我一直在寻找答案,但没有找到任何我能完全理解的东西。谢谢
1条答案
按热度按时间8i9zcol21#
调用recover只会在从deferred函数直接调用时停止死机。下面是recover文档中的相关文本:
在延迟函数(但不是它调用的任何函数)内执行恢复调用,通过恢复正常执行来停止panicking序列,并检索传递给panic调用的错误值。