登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-25 09:24:42 111浏览 收藏

哈喽!今天心血来潮给大家带来了《为什么golang无法从defer函数调用的函数中的panic中恢复》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

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

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


正确答案


specification says

如果满足以下任一条件,recover 的返回值为 nil:

  • ...
  • recover 未由延迟函数直接调用。

在第一个示例中,延迟函数不直接调用 recover。在这种情况下,recover 函数始终返回 nil

您可以通过直接延迟函数来使用myrecover

func main() {
    defer myRecover()
    panic("The gas price is skyrocketing!")
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为什么golang无法从defer函数调用的函数中的panic中恢复》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>