Golang的安全关闭

Qia*_*hen 7 recover go panic

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

谢谢,Elgs

Cal*_*leb 7

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

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

defer socket.Close()
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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