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

我使用哪一个更好:“defer-panic-recover”还是在Golang中检查“if err!=nil{//doSomething}”?

羊城
2023-03-14

我做了一个大程序,打开和关闭文件和数据库,执行写和读等其他事情。因为没有“go中的异常处理”,而且我并不真正了解“defer”语句和“recover()”函数,所以我在每个文件打开、读写、数据库输入等之后都应用了错误检查。

_,insert_err := stmt.Run(query)
if insert_err != nil{
    mylogs.Error(insert_err.Error())
    return db_updation_status
}

为此,我在开始时将db_updation_status定义为“false”,直到程序中的一切都正常为止,才将其设置为“true”。我在每一个函数中都这样做过,在我认为可能出错的每一个操作之后。

你认为使用延迟-恐慌-恢复有更好的方法吗?我在http://golang.org/doc/articles/defer_panic_recovere.html中读到了这些内容,但不清楚如何使用它们。这些构造提供了类似于异常处理的东西吗?我没有这些构造会更好吗?如果有人能用简单的语言向我解释这一点,和/或为这些构造提供一个用例,并将它们与我上面使用的错误处理类型进行比较,我将非常感谢。

共有1个答案

郑晨
2023-03-14

返回错误值更方便-它们比两个值的bool携带更多信息(对客户机/用户有利)。

与恐慌/恢复有关的问题:在某些情况下,它们的使用是完全正常的。例如,在手写的递归下降解析器中,在所有调用级别上“冒泡”一个错误条件是相当困难的。在本例中,如果在最高层(API)级别有延迟恢复,并且可以在任何调用级别报告任何类型的错误,那么这是一个受欢迎的简化,例如

panic(fmt.Errorf("Cannot %v in %v", foo, bar))
 类似资料:
  • 想改进这个问题吗?更新问题,以便通过编辑这篇文章用事实和引用来回答。 我在玩Java*流API,在Lagecy系统中有以下代码: 我编写了与上述代码等价的流,如下所示: 无论哪种方式,我都得到了想要的结果。我的问题是,在这种情况下,哪种性能方面是更好的写作方式?如果我选择其中任何一个而不是另一个,我实际上是否获得了任何价值?地图中包含大约 1000 个值。

  • 问题内容: 在性能方面,会更好。使用PHP来回显所有HTML输出,因此我可以将其与工作代码和变量的各种内容结合使用,或者在整个文档中定期将HTML逃逸到php。 我知道可能存在一些可读性问题,但我不必为此担心。 谢谢大家! 例子1 要么 问题答案: 这是您最容易阅读的内容。当然,每种情况都会有所不同。如果您要处理整个页面,并且其中有很大一部分没有任何PHP,那么我会脱离PHP并只编写纯HTML,而

  • 正如名字一样,这个(recover)内建函数被用于从 panic 或 错误场景中恢复:让程序可以从 panicking 重新获得控制权,停止终止过程进而恢复正常执行。 recover 只能在 defer 修饰的函数(参见 6.4 节)中使用:用于取得 panic 调用中传递过来的错误值,如果是正常执行,调用 recover 会返回 nil,且没有其它效果。 总结:panic 会导致栈被展开直到 d

  • 问题内容: 我正在使用MySQL存储视频游戏数据。我有用于标题,平台,标签,徽章,评论,开发人员,出版商等的表… 当某人正在观看游戏时,最好有一个查询来返回与游戏相关的所有数据,还是最好使用多个查询?直观地,由于我们具有评论,将它们包括在同一查询中似乎毫无意义,因为它们需要分页。但是在其他情况下,我不确定是否要分解查询或使用两个查询… 我有点担心性能,因为我现在加入游戏下表:开发人员,发行者,元标

  • 问题内容: 我们有一个大型的golang应用程序,它使用记录器(实际上是自定义记录器)将输出写入定期轮换的日志文件中。 但是,当应用程序崩溃或出现panic()时,这些消息将变为标准错误。 有什么方法可以覆盖使用记录仪的紧急功能? 问题答案: 据我所知,您无法将恐慌的输出重定向到标准错误或记录器。最好的办法是将标准错误重定向到可以在外部或在程序内部执行的文件。 对于我的rclone程序,我重定向了