所以,我一直在摆弄go,我发现下面的函数恢复成功
package main
import (
"fmt"
)
func a() {
defer func(){
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}()
n := []int{5, 7, 4}
fmt.Println(n[3])
fmt.Println("normally returned from a")
}
func main() {
a()
fmt.Println("normally returned from main")
}
但这不是
package main
import (
"fmt"
)
func r() {
if r := recover(); r != nil {
fmt.Println("Recovered", r)
}
}
func a() {
defer func(){
r()
}()
n := []int{5, 7, 4}
fmt.Println(n[3])
fmt.Println("normally returned from a")
}
func main() {
a()
fmt.Println("normally returned from main")
}
有人能解释一下为什么吗?我一直在寻找答案,但没有找到任何我可以完全理解的内容。
谢谢。
仅当直接从延迟函数调用时,调用恢复才会停止恐慌。这是来自的相关文本恢复文档 https://godoc.org/builtin#recover:
在延迟函数(但不是它调用的任何函数)内执行恢复调用可以通过恢复正常执行来停止恐慌序列,并检索传递给恐慌调用的错误值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)