2013-12-10 50 views
7

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

感谢, Elgs

+2

socket.Close()不能导致恐慌IIRC。 – fuz

+2

我不完全确定:关闭(例如net.TCPConn)可能会导致错误,但我认为它不会惊慌。如果它恐慌,例如由于硬件损坏或内存不足,您的应用程序无论如何都会被吹掉。根据你的情况,你可能想要处理返回的错误,但在Close中处理恐慌似乎有点偏执。 – Volker

+0

@FUZxxl当我尝试关闭拒绝服务器连接的客户端套接字时,它会发生混乱。有没有什么办法可以判断一个套接字是否安全地关闭而不会发生恐慌。或者,我必须为套接字关闭逻辑嵌套更多级别的延迟。 –

回答

7

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

正如别人所说的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

递延功能周围之前立即执行函数返回,按照相反的顺序它们被推迟。