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