当我打开套接字连接时,我在套接字打开后立即将socket.Close()逻辑放入defer函数中.但是,如果socket.Close()会导致另一个恐慌怎么办?我应该总是在外部延迟内嵌套另一个延迟/恢复以防止我的程序崩溃吗?像这样:http://play.golang.org/p/GnEMQS-0jj
谢谢,Elgs
一般来说,你不必担心恐慌.它们通常代表两类错误:开发人员错误(nil引用,数组超出范围)和系统级错误,你可能无法做很多事情(比如耗尽内存).
正如其他人所说的socket.Close
不会恐慌,而是会返回错误.如果你这样做:
defer socket.Close()
Run Code Online (Sandbox Code Playgroud)
错误被丢弃,您不需要做任何其他事情.
但是假设你确实想从恐慌中恢复过来.如果你的恢复处理程序先被推迟,那么你不需要做任何其他事情:
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
defer panic("this will be recovered")
}
Run Code Online (Sandbox Code Playgroud)
延迟函数以相反的顺序运行:http://golang.org/ref/spec#Defer_statements
延迟函数在周围函数返回之前立即执行,其延迟顺序相反.