当我打开一个套接字连接时,我会立即在套接字打开后的defer函数中放置socket.Close()逻辑。但是,如果socket.Close()导致另一个panic怎么办?我是否应该始终在外部defer中嵌套另一个defer/recover以防止程序崩溃?类似这样:http://play.golang.org/p/GnEMQS-0jj。
谢谢, Elgs
谢谢, Elgs
通常情况下,您不需要过多担心panic。它们通常代表两类错误:开发人员错误(nil引用、数组越界)和系统级错误,您可能无法做太多关于这些错误(例如内存耗尽)。
正如其他人所说,socket.Close
不会引起panic,而是返回一个错误。如果您这样做:
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
在包围函数返回之前,延迟函数会立即执行,按它们被延迟的相反顺序执行。