首页 >后端开发 >Golang >Go Panic Recovery:推迟 `recover()` – 有什么区别?

Go Panic Recovery:推迟 `recover()` – 有什么区别?

Patricia Arquette
Patricia Arquette原创
2024-12-03 03:35:11561浏览

Go Panic Recovery: Deferring `recover()` – What's the Difference?

延迟recover()与延迟recover()

在Go中,可以使用recover()函数捕获并处理恐慌。但是,需要注意的是,defer 相对于recover() 调用的放置具有重要意义。

场景 A: defer func() { receive() }()

在这种情况下,defer 语句安排一个匿名函数在当前函数的末尾执行。当执行该函数时,它会调用recover()函数。这是捕获和处理恐慌的有效方法,因为即使在封闭函数恢复执行之前发生恐慌,recover()函数也会被执行。

场景 B:延迟recover()

在这种情况下,recover() 函数本身被安排为延迟函数。然而,这并不能按预期工作,因为recover() 不会调用自身。因此,在封闭函数恢复执行之前发生的任何恐慌都不会被此延迟调用捕获。

Go 文档中记录了此行为:“如果在延迟函数之外调用恢复,则不会停止恐慌序列。”

一个有趣的例子: defer (func() { receive() })()

为了进一步说明这一点,请考虑以下代码:

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

令人惊讶的是,此代码也不会出现恐慌。在本例中,我们创建一个函数类型的recover变量并将其初始化为调用内置recover()的匿名函数。然后我们将恢复变量的值指定为延迟函数。这使我们能够捕获并处理恐慌,因为延迟函数有效地调用了recover(),从而停止了恐慌序列。

以上是Go Panic Recovery:推迟 `recover()` – 有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

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