Golang恐慌崩溃预防

时间:2014-08-18 05:01:24

标签: go crash recover panic

在Golang中,没有恢复的恐慌会导致进程崩溃,因此我最终将以下代码片段放在每个函数的开头:

defer func() {
    if err := recover(); err != nil {
        fmt.Println(err)
    }
}()

只是为了防止我的程序崩溃。现在我想知道,它真的是要走的路吗?因为我认为在任何地方放置相同的代码看起来有点奇怪。

在我看来,Java方式,将异常冒泡到调用函数,直到main函数是控制异常/恐慌的更好方法。我理解这是Go的设计,但是就像Go那样立即崩溃这个过程有什么好处呢?

2 个答案:

答案 0 :(得分:9)

如果你确切知道原因,你应该只从恐慌中恢复过来。 Go计划将在两种情况下恐慌:

  • 程序逻辑错误(例如nil指针取消引用或越界数组或切片访问)
  • 代码调用的代码或代码中的故意恐慌(使用panic(...)调用)

在第一种情况下,崩溃是合适的,因为这意味着您的程序已进入错误状态且不应继续执行。在第二种情况下,如果您期望它,您应该只从恐慌中恢复过来。解释这个的最好方法就是说它非常罕见,如果你看到它就会知道这种情况。我几乎肯定无论你写的是什么代码,你都不需要从恐慌中恢复过来。

答案 1 :(得分:3)

通常情况下,即使有例外情况,您也可以在" FaultBarrier"中捕获它们。它通常是产生所有新线程的地方。重点是捕获并记录意外故障。

在Go中,您可以对所有预期的失败使用返回值。您工作的框架通常会有一个故障障碍来捕获会话(即:通常是一个http事务)并记录问题。我看到恢复发生的唯一其他地方就是非幂等关闭函数。如果你有一种情况,你无法判断某些事情是否已经关闭但是必须关闭,那么你最终可能会进行恢复,以便忽略第二次紧急恐慌,而不是失败你正在做的事情一直到FaultBarrier。