当前位置: 首页 > 知识库问答 >
问题:

Golang恐慌防撞车

盛建德
2023-03-14

在Golang中,没有恢复的panic将使进程崩溃,因此我最后将以下代码片段放在每个函数的开头:

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

只是为了防止我的程序崩溃。现在我在想,真的是要走的路吗?因为我觉得到处放同样的代码看起来有点奇怪。

在我看来,这是Java的方式,将异常冒泡到调用函数,直到main函数成为控制异常/恐慌的更好方式。我明白这是Go的设计,但像Go一样立即崩溃进程的好处是什么?

共有1个答案

空鸿云
2023-03-14

只有当你确切地知道原因时,你才会从恐慌中恢复过来。围棋程序在两种情况下会出现恐慌:

  • 程序逻辑错误(例如,零指针取消引用或超出界限的数组或切片访问)
  • 从您的代码或您的代码调用的代码中故意出现的恐慌(使用panic(...))

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

 类似资料:
  • 问题内容: 在Golang中,没有恢复的紧急情况会使进程崩溃,因此我最终将以下代码片段放在每个函数的开头: 只是为了防止我的程序崩溃。现在我想知道,这真的是要走的路吗?因为我认为到处都放置相同的代码看起来有些奇怪。 在我看来,以Java的方式将异常冒泡到调用函数之前,直到main函数是控制异常/恐慌的更好方法为止。我了解这是Go的设计,但是像Go一样立即使过程崩溃的好处是什么? 问题答案: 如果您

  • 问题内容: 调用反射值的.FieldByName方法时出现以下错误,确切的错误是:- 和代码是:- 我了解的并不多,但这就是我所能获得的所有信息。 这是Go Playground上代码的链接:http : //play.golang.org/p/E038cPOoGp 问题答案: 您已经是一个指向结构的指针。尝试打印出您的代码。 没有理由使用的地址,然后调用that ,它会取消对刚创建的指针的引用。

  • 问题内容: 我有以下连接到Mongo的功能。为了进行测试,我关闭了mongod,并希望允许该程序在w / 0 mongo不可用的情况下继续运行。如果无法连接服务器,MGO似乎会引发紧急情况,因此我在下面编写了一个延迟/恢复操作,但是紧急情况仍然导致程序退出。从中恢复的正确方法是什么? 问题答案: 运行您发布的代码的以下版本。尽量不要修改代码,至少不要更改行号的位置。这样,如果您发布堆栈跟踪,则数字

  • 我目前正在考虑如何编写测试来检查给定的代码是否出现了恐慌?我知道Go使用来捕捉恐慌,但与Java代码不同的是,您不能真正指定在发生恐慌时应该跳过哪些代码或您有哪些代码。所以如果我有一个函数: 我真的不知道是否发生了恐慌,我们恢复了,或者函数是否根本没有恐慌。如何指定在没有恐慌的情况下跳过哪些代码,以及在出现恐慌的情况下执行哪些代码?我如何检查我们是否从恐慌中恢复过来?

  • 有什么方法可以重写panic功能来使用我们的记录器吗?

  • 想想一个大项目,它处理由它自己的goroutine处理的大量并发请求。碰巧代码中有一个bug,其中一个请求会因为引用为nil而引起恐慌。 在Java、C#和许多其他语言中,这最终会导致异常,异常会停止请求,而不会对其他正常的请求造成任何损害。在围棋中,这会破坏整个程序。 AFAIK,对于每一个新的go例程创建,我都必须有。这是防止整个程序崩溃的唯一方法吗? 更新:为每个gorouting创建添加调