当我打开一个套接字连接时,我在打开套接字后立即将 socket.Close() 逻辑放在一个 defer 函数中。但是,如果 socket.Close() 会引起另一个恐慌怎么办?我是否应该总是在外部延迟中嵌套另一个延迟/恢复以防止我的程序崩溃?像这样的东西:http ://play.golang.org/p/GnEMQS-0jj
谢谢, 埃尔格斯
当我打开一个套接字连接时,我在打开套接字后立即将 socket.Close() 逻辑放在一个 defer 函数中。但是,如果 socket.Close() 会引起另一个恐慌怎么办?我是否应该总是在外部延迟中嵌套另一个延迟/恢复以防止我的程序崩溃?像这样的东西:http ://play.golang.org/p/GnEMQS-0jj
谢谢, 埃尔格斯
一般来说,你不需要太担心恐慌。它们通常代表两类错误:开发人员错误(无引用、数组越界)和您可能无能为力的系统级错误(例如内存不足)。
正如其他人所说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
延迟函数在周围函数返回之前立即执行,与它们被延迟的顺序相反。