当我打开套接字连接时,我会在打开套接字后立即将 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/