理解嵌套延迟函数中的recover()限制
在Golang中,panic和recover提供了错误处理和恢复的机制。虽然recover()通过返回恐慌值来帮助处理恐慌,但其行为在嵌套延迟函数中发生变化。
示例 1:简单延迟函数
考虑以下代码片段:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer printRecover() panic("OMG!") // Recoverable panic }
这段代码会出现“OMG!”恐慌并使用延迟的 printRecover() 函数成功恢复恐慌值,如输出所示:
Recovered: OMG!
示例 2:嵌套延迟函数
现在,让我们将 printRecover() 包装在另一个延迟函数中:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer func() { printRecover() }() panic("OMG!") // Panic goes unrecoverable }
中在这个例子中,恐慌变得不可恢复,程序恐慌并显示以下消息:
Recovered: <nil> panic: OMG! goroutine 1 [running]: main.main() /tmp/sandbox898315096/main.go:15 +0x60
理解差异
这两个示例之间的区别在于方式调用recover()。根据 Golang 规范:
在示例 1 中,printRecover() 直接由延迟函数调用deferred 函数,允许它返回恐慌值。然而,在示例 2 中, printRecover() 由匿名函数调用,然后被延迟。这会导致recover()返回nil,因为它不是由延迟函数直接调用。
因此,要成功恢复嵌套延迟函数中的恐慌,必须直接从延迟函数调用recover()。
以上是Go 中嵌套延迟函数与非嵌套延迟函数的'recover()”行为有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!