Recover()在嵌套延迟函数中的行为
在Go中,panic()和recover()用于处理运行时错误。但是,可恢复的错误必须由延迟函数处理。
简单案例:
在简单的延迟函数场景中,recover() 按预期运行:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer printRecover() panic("OMG!") }
嵌套延迟案例:
当 printRecover() 包装在嵌套延迟函数中时:
func main() { defer func() { printRecover() }() panic("OMG!") }
行为发生变化。 printRecover() 中的recover() 返回 nil。这是因为:
根据Go规范:
如果recover()不是由延迟函数直接调用,则recover()的返回值为nil。
在嵌套情况下, printRecover() 由嵌套延迟函数调用,而不是直接由初始函数调用一.
结论:
为了让recover()在嵌套的延迟函数中工作,它必须由处理panic的延迟函数直接调用。当不满足这个条件时,recover()将返回nil。
以上是为什么 Go 中的嵌套延迟函数中 `recover()` 返回 `nil`?的详细内容。更多信息请关注PHP中文网其他相关文章!