为什么 golang 无法从 defer 函数调用的函数中的恐慌中恢复

package main


import "fmt"


func myRecover() {

    if r := recover(); r != nil {

        fmt.Println(r)

    }

}


func main() {

    defer func() {

        myRecover()

    }()

    panic("The gas price is skyrocketing!")

}

上面的代码无法以某种方式从恐慌中恢复过来,下面的代码可以。


package main


import "fmt"


func main() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Println(r)

        }

    }()

    panic("The gas price is skyrocketing!")

}

这太令人困惑了。我想知道为什么。


慕哥9229398
浏览 131回答 1
1回答

catspeake

规范说:如果满足以下任何条件,则 recover 的返回值为 nil:...recover 不是由延迟函数直接调用的。在第一个示例中,recover延迟函数不直接调用。在这种情况下,recover函数总是返回。nil您可以myRecover通过直接延迟功能来使用。func main() {         defer myRecover()         panic("The gas price is skyrocketing!") }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go