Golang的安全关闭

时间:2013-12-10 13:22:46

标签: go recover panic

当我打开套接字连接时,我会在打开套接字后立即将socket.Close()逻辑放入defer函数中。但是,如果socket.Close()会导致另一个恐慌怎么办?我应该总是在外部延迟内嵌套另一个延迟/恢复以防止我的程序崩溃吗?这样的事情:http://play.golang.org/p/GnEMQS-0jj

谢谢, Elgs

1 个答案:

答案 0 :(得分:7)

一般来说,你不必担心恐慌。它们通常代表两类错误:开发人员错误(nil引用,数组越界)和系统级错误,你可能无法做很多事情(比如耗尽内存)。

正如其他人所说,socket.Close不会恐慌,而是会返回错误。如果你这样做:

defer socket.Close()

错误被丢弃,您不需要做任何其他事情。

但是假设你确实想从恐慌中恢复过来。如果您的恢复处理程序先被推迟,那么您不需要做任何其他事情:

func main() {
  defer func() {
    if err := recover(); err != nil {
      fmt.Println(err)
    }
  }()
  defer panic("this will be recovered")
}

延迟函数以相反的顺序运行:http://golang.org/ref/spec#Defer_statements

  

延迟函数在周围函数返回之前立即执行,顺序与延迟相反。