调用函数是否会中断recover()?

时间:2016-04-19 20:07:59

标签: go

我正在使用一个recover()来自恐慌的库,它使用的代码简化为以下内容:

func main() {
    defer rec()
    panic("X")
}

func rec() {
    rec2()
}

func rec2() {
    fmt.Printf("recovered: %v\n", recover())
}

这个输出是:

recovered: <nil>
panic: X
... more panic output ...

值得注意的是,recover()会返回nil而不是错误。这是预期的行为吗?

1 个答案:

答案 0 :(得分:3)

recover必须由延迟函数直接调用。

来自language spec

  

如果满足以下任何条件,则恢复的返回值为零   成立:

     
      
  • 恐慌的论点是nil;
  •   
  • goroutine并不恐慌;
  •   
  • 恢复不是由延迟函数直接调用的。
  •