所以,我一直在研究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")
}
有人可以解释为什么吗?我一直在寻找答案,但没有找到我可以完全理解的任何内容。 谢谢。
答案 0 :(得分:1)
仅在直接从延迟函数调用时,恢复调用才会停止恐慌。以下是recover documentation中的相关文本:
在延迟函数(但不是由它调用的任何函数)中执行恢复调用,将通过恢复正常执行来停止恐慌序列,并检索传递给panic调用的错误值。