首页 > 后端开发 > Golang > 正文

Go 中嵌套延迟函数与非嵌套延迟函数的'recover()”行为有何不同?

Susan Sarandon
发布: 2024-11-23 04:24:16
原创
1001 人浏览过

How Does `recover()` Behavior Differ in Nested vs. Non-Nested Deferred Functions in Go?

理解嵌套延迟函数中的recover()限制

在Golang中,panic和recover提供了错误处理和恢复的机制。虽然recover()通过返回恐慌值来帮助处理恐慌,但其行为在嵌套延迟函数中发生变化。

示例 1:简单延迟函数

考虑以下代码片段:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer printRecover()

    panic("OMG!") // Recoverable panic
}
登录后复制

这段代码会出现“OMG!”恐慌并使用延迟的 printRecover() 函数成功恢复恐慌值,如输出所示:

Recovered: OMG!
登录后复制

示例 2:嵌套延迟函数

现在,让我们将 printRecover() 包装在另一个延迟函数中:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer func() {
        printRecover()
    }()

    panic("OMG!") // Panic goes unrecoverable
}
登录后复制

中在这个例子中,恐慌变得不可恢复,程序恐慌并显示以下消息:

Recovered: <nil>
panic: OMG!

goroutine 1 [running]:
main.main()
    /tmp/sandbox898315096/main.go:15 +0x60
登录后复制

理解差异

这两个示例之间的区别在于方式调用recover()。根据 Golang 规范:

  • recover() 如果不是由延迟函数直接调用,则返回 nil。

在示例 1 中,printRecover() 直接由延迟函数调用deferred 函数,允许它返回恐慌值。然而,在示例 2 中, printRecover() 由匿名函数调用,然后被延迟。这会导致recover()返回nil,因为它不是由延迟函数直接调用。

因此,要成功恢复嵌套延迟函数中的恐慌,必须直接从延迟函数调用recover()。

以上是Go 中嵌套延迟函数与非嵌套延迟函数的'recover()”行为有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板