当我打开套接字连接时,我会在打开套接字后立即将socket.Close()逻辑放入defer函数中。但是,如果socket.Close()会导致另一个恐慌怎么办?我应该总是在外部延迟内嵌套另一个延迟/恢复以防止我的程序崩溃吗?这样的事情:http://play.golang.org/p/GnEMQS-0jj
谢谢, Elgs
答案 0 :(得分:7)
一般来说,你不必担心恐慌。它们通常代表两类错误:开发人员错误(nil引用,数组越界)和系统级错误,你可能无法做很多事情(比如耗尽内存)。
正如其他人所说,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
延迟函数在周围函数返回之前立即执行,顺序与延迟相反。