defer receive() 与 defer func() { receive() }()
问:为什么调用 defer func () {recover() }() 成功恢复了一个恐慌的 goroutine,而调用 deferrecover() 则成功恢复了不是吗?
答:正如recover()的官方文档所述:
“如果在延迟函数之外调用recover,它不会停止恐慌序列。”
对于 defer recovery() 来说,recover() 就是延迟函数本身。执行时,recover() 不会调用自身。因此,它无法停止恐慌序列。
如果recover()可以调用自身,它就会停止恐慌。然而,这种情况是不可行的。
其他注意事项:
以下代码也可以避免恐慌:
package main func main() { var recover = func() { recover() } defer recover() panic("panic") }
在这种情况下,创建名为recover的函数类型变量来存储调用内置recover()函数的匿名函数。然后将延迟函数设置为调用恢复变量的值。这通过间接调用recover()函数成功地停止了恐慌序列。
以上是Defer `recover()` 与 `defer func() { receive() }()`:为什么一个可以恢复恐慌而另一个不能?的详细内容。更多信息请关注PHP中文网其他相关文章!