问题:
为什么调用 defer func( ) {recover() }() 成功恢复了一个恐慌的 goroutine,但是调用了 deferrecover()不是吗?
答案:
根据recover()的文档,“如果在延迟函数外部调用recover,它将不停止恐慌序列。”
在延迟的情况下recovery(),recover()本身就是延迟函数。因此,它不会调用自身,从而导致持续的恐慌序列。
如果recover()将自身作为延迟函数调用,它将停止恐慌序列。然而,这是不合逻辑的。
一个有趣的变体:
以下代码也避免了恐慌:
package main func main() { var recover = func() { recover() } defer recover() panic("panic") }
在这里,我们创建具有调用内置recover() 函数的函数值的recover 变量。通过推迟对该变量值的调用,我们调用内置的recover(),然后它会停止恐慌序列。
以上是为什么'defer receive()”无法捕获恐慌,而'defer func() {recover() }()”却成功?的详细内容。更多信息请关注PHP中文网其他相关文章!