【发布时间】:2014-10-10 23:17:58
【问题描述】:
在 Golang 中,没有恢复的恐慌会导致进程崩溃,因此我最终将以下代码 sn-p 放在每个函数的开头:
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
只是为了防止我的程序崩溃。现在我想知道,这真的是要走的路吗?因为我觉得到处都放同样的代码看起来有点奇怪。
在我看来,Java 方式将异常冒泡到调用函数,直到 main 函数是控制异常/恐慌的更好方法。我知道这是 Go 的设计,但是像 Go 那样立即使进程崩溃有什么好处?
【问题讨论】:
-
您不应该将恐慌视为 Go 中的 Java 异常。它们很少使用。在 Java 中,它们用于指示任何类型的错误情况。另一方面,在 Go 中,指示错误的习惯用法是将错误作为最后一个返回值返回(例如,参见 os.Open)。因此,恐慌被保留用于应该像 nil 指针取消引用那样使程序崩溃的情况。
-
是的,但是为了编写一个健壮的服务器程序员,尤其是一个可扩展的插件或拦截器系统,你真的不应该让插件或拦截器轻易地让你的主服务器崩溃,对吗?
-
正确,可能需要这种行为(Go 的 net/http 服务器使用恢复来捕获恐慌的 goroutine),但同时你没有问这个问题。恐慌/延迟/恢复是例外 - 仅在需要时使用它们,不再使用。
-
谢谢@elithrar,我知道在使用恐慌/恢复时我应该小心。但是,如果我使用其他人的图书馆,那将是我无法控制的。是的,为了安全起见,我可以在我的每个功能上执行延迟/恢复,这就是我现在所做的。我只是想知道,与 Java 的冒泡模型相比,如此容易使进程崩溃有什么优势?
-
@synful,是的,同意,但是,在 Java RuntimeException 或 NullPointerException 中不会使进程崩溃。我看不出有什么优势使进程崩溃而不是在 main 之前冒泡给调用者。