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

为什么 Go 中的嵌套延迟函数中 `recover()` 返回 `nil`?

Patricia Arquette
发布: 2024-11-24 06:56:09
原创
904 人浏览过

Why Does `recover()` Return `nil` in Nested Deferred Functions in Go?

Recover()在嵌套延迟函数中的行为

在Go中,panic()和recover()用于处理运行时错误。但是,可恢复的错误必须由延迟函数处理。

简单案例:

在简单的延迟函数场景中,recover() 按预期运行:

package main

import "fmt"

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

func main() {
    defer printRecover()
    panic("OMG!")
}
登录后复制

嵌套延迟案例:

当 printRecover() 包装在嵌套延迟函数中时:

func main() {
    defer func() {
        printRecover()
    }()
    panic("OMG!")
}
登录后复制

行为发生变化。 printRecover() 中的recover() 返回 nil。这是因为:

根据Go规范:

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

在嵌套情况下, printRecover() 由嵌套延迟函数调用,而不是直接由初始函数调用一.

结论:

为了让recover()在嵌套的延迟函数中工作,它必须由处理panic的延迟函数直接调用。当不满足这个条件时,recover()将返回nil。

以上是为什么 Go 中的嵌套延迟函数中 `recover()` 返回 `nil`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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