延迟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中文网其他相关文章!