8

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

谢谢, 埃尔格斯

4

1 回答 1

8

一般来说,你不需要太担心恐慌。它们通常代表两类错误:开发人员错误(无引用、数组越界)和您可能无能为力的系统级错误(例如内存不足)。

正如其他人所说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

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

于 2013-12-10T23:01:35.217 回答