延迟功能无法恢复

问题描述 投票:0回答:1

所以,我一直在摆弄go,发现下面的函数成功恢复了

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

有人可以解释为什么吗?我一直在寻找答案,但没有找到我可以完全理解的任何内容。谢谢。

go deferred recover panic
1个回答
0
投票
仅当从延迟函数直接调用恢复时,才会停止恐慌。这是来自recover documentation的相关文本:

[执行在延迟函数内部进行恢复的调用(但不是由它调用的任何函数)通过​​恢复正常执行来停止恐慌序列,并检索传递给panic调用的错误值。
© www.soinside.com 2019 - 2024. All rights reserved.