首页 >后端开发 >Golang >为什么 `defer receive()` 不会在 Go 中捕获恐慌?

为什么 `defer receive()` 不会在 Go 中捕获恐慌?

Linda Hamilton
Linda Hamilton原创
2024-12-05 02:08:09888浏览

Why Doesn't `defer recover()` Catch Panics in Go?

defer receive() 何时无法捕获恐慌?

在 Go 中,defer 函数会按照其声明的相反顺序执行,当函数正常返回或出现恐慌。虽然 defer func() {recover() }() 可以有效地从恐慌中恢复,但 deferrecover() 却并非如此。

此行为源于 receive() 的文档,该文档指出“如果在外部延迟函数调用recover,它不会停止恐慌序列。”在 defer receive() 的情况下,recover 本身是延迟函数,因此不会调用自身。

示例:

考虑以下代码:

package main

func main() {
    defer recover()
    panic("panic")
}

这段代码确实会出现恐慌,并显示消息“panic:panic”,表明 deferrecover() 并没有阻止

工作示例:

相反,以下代码成功从恐慌中恢复:

package main

func main() {
    defer func() { recover() }()
    panic("panic")
}

在这种情况下,匿名当主函数返回或出现紧急情况时调用该函数。在这个匿名函数中,调用recover(),成功捕获并防止了恐慌。

例外示例:

有趣的是,以下代码也避免了恐慌:

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}

这里,recover 函数变量保存了对调用内置recover() 的匿名函数的引用。指定此变量作为延迟函数可以有效地调用内置的recover(),从而停止恐慌。

以上是为什么 `defer receive()` 不会在 Go 中捕获恐慌?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn