首页  >  文章  >  后端开发  >  在 Golang 中现有的紧急情况下,您可以在延迟函数中发生紧急情况吗?

在 Golang 中现有的紧急情况下,您可以在延迟函数中发生紧急情况吗?

Susan Sarandon
Susan Sarandon原创
2024-11-02 12:03:03357浏览

Can You Panic Within a Defer Function During an Existing Panic in Golang?

在延迟函数中出现恐慌是否可以接受,特别是当恐慌已经发生时?

上下文:

在提供的代码:

<code class="go">func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}</code>

似乎第一个恐慌(恐慌(1))被第二个恐慌(恐慌(2))“覆盖”。

是可以接受吗?

在 Golang 中,延迟函数引起的恐慌并不构成独特或异常情况。它只是表明恐慌序列将持续存在。

如示例代码所示,允许在 defer 函数中调用可能发生恐慌的 Golang 函数。即使恐慌已经发生,在 defer 函数中出现恐慌也是可以接受的。

机制:

根据 Go 规范:

“如果 D 正常返回,而没有引发新的恐慌,则恐慌序列就会停止。”

在示例中,延迟函数 (D) 返回而不触发新的恐慌。因此,panic(1) 启动的恐慌序列将停止。

其他注意事项:

  • 所有延迟函数都将执行,无论它们是否引起恐慌.
  • 延迟函数中的恐慌将“包装”现有的恐慌,而不是“覆盖”它。然而,recover()只能检索传递给最近一次panic()的值。
  • 可以通过将延迟函数与recover()嵌套来恢复和处理传递给多个panic的值。

以上是在 Golang 中现有的紧急情况下,您可以在延迟函数中发生紧急情况吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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