go - Golang 中的安全关闭连接

标签 go recover panic

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

谢谢, 埃尔格斯

最佳答案

通常您不必太担心 panic 。它们通常代表两类错误:开发人员错误(无引用、数组越界)和您可能无能为力的系统级错误(如内存不足)。

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

defer socket.Close()

错误已被丢弃,您无需执行任何其他操作。

但假设您确实想从 panic 中恢复过来。如果您首先延迟了恢复处理程序,那么您无需执行任何其他操作:

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

Deferred functions are executed immediately before the surrounding function returns, in the reverse order they were deferred.

关于go - Golang 中的安全关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20495758/

相关文章:

struct - 为什么将结构传递给当前包中带有文字结构参数的函数不同于另一个包中的函数?

pointers - Golang 指针作为方法参数

azure - 如何使用 Powershell 从 Microsoft Azure 恢复已删除的容器?

error-handling - 是否有将错误转换为 panic 的宏?

c - linux内核 panic 消息在哪里?

go - 有什么方法可以检查 Go 程序中未处理的错误吗?

javascript - 去解析JWT : error verifying ID token: illegal base64 data at input byte 0

vba - Outlook崩溃且必须重新安装后,如何恢复Outlook VBA代码?

linux - Mips Linux : Logging Kernel Panic into mtd partition