首页 >后端开发 >Golang >Defer `recover()` 与 `defer func() { receive() }()`:为什么一个可以恢复恐慌而另一个不能?

Defer `recover()` 与 `defer func() { receive() }()`:为什么一个可以恢复恐慌而另一个不能?

DDD
DDD原创
2024-11-29 11:27:101036浏览

Defer `recover()` vs. `defer func() { recover() }()`: Why Does One Recover Panics and the Other Doesn't?

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

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