Go语言 延迟函数不恢复

7tofc5zh  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(83)

所以,我一直在摆弄围棋,我发现下面的功能恢复成功

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")
}

有人能解释一下为什么吗?我一直在寻找答案,但没有找到任何我能完全理解的东西。谢谢

8i9zcol2

8i9zcol21#

调用recover只会在从deferred函数直接调用时停止死机。下面是recover文档中的相关文本:
在延迟函数(但不是它调用的任何函数)内执行恢复调用,通过恢复正常执行来停止panicking序列,并检索传递给panic调用的错误值。

相关问题