Golang恐慌崩溃预防

Qia*_*hen 9 crash recover go panic

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

defer func() {
    if err := recover(); err != nil {
        fmt.Println(err)
    }
}()
Run Code Online (Sandbox Code Playgroud)

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

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

jos*_*hlf 10

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

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

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

  • @ sebcap26,有一种方法可以在不引起恐慌的情况下进行类型断言.如果你执行`val,ok:= interfaceValue.(Type)`,类型断言的第二个返回值(即,放在`ok`中的值)将是一个布尔值,表示断言是否成功.使用这个,如果断言失败,它只会使`ok`为false而不是恐慌. (3认同)
  • 我正在做的是我正在编写一个等待传入连接的服务器。当传入连接连接时,服务器启动一个 go 例程来处理传入连接。如果任何常规程序出现恐慌,我不希望服务器崩溃。我什至不在乎 go 例程中发生了什么。如果失败,那就失败了。在这种情况下,似乎我必须确保我必须恢复 go 例程代码中任何可能的恐慌。我是对的,还是我错过了什么? (2认同)
  • 如果您的程序发生混乱,则表示编程错误.您想要忽略的任何正常错误(如网络超时或格式错误的请求)将以函数返回的错误值的形式出现,而不是恐慌. (2认同)
  • @ElgsQianChen go 中的 panic() 会导致程序崩溃,就像 C 中的 NULL 指针取消引用一样。在这两种情况下,您都不会真正希望程序继续执行。 (2认同)
  • 我处于同样的情况。在我的服务器上,我从 WebSocket 接收 JSON 数据。假设数据正确,我将对其进行解码并对其进行类型断言。对于正常使用,这不会失败,但是如果数据已被更改怎么办?恢复恐慌不是确保黑客(例如)不会以这种方式使我的服务器崩溃的最佳方法吗? (2认同)