延迟功能无法恢复

时间:2019-10-18 02:30:53

标签: go deferred recover panic

所以,我一直在研究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")
}

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

1 个答案:

答案 0 :(得分:1)

仅在直接从延迟函数调用时,恢复调用才会停止恐慌。以下是recover documentation中的相关文本:

  

在延迟函数(但不是由它调用的任何函数)中执行恢复调用,将通过恢复正常执行来停止恐慌序列,并检索传递给panic调用的错误值。