error-handling - 我用: "defer-panic-recover" or checking "if err != nil {//dosomething}" in golang?哪个比较好

标签 error-handling go panic

我制作了一个大型程序,可以打开和关闭文件和数据库,执行写入和读取等操作。由于没有“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”。 在我认为可能出错的每个操作之后,我在每个函数中都这样做了。

您认为使用 defer-panic-recover 有更好的方法吗?我在这里阅读了这些 http://golang.org/doc/articles/defer_panic_recover.html ,但不清楚如何使用它们。这些构造是否提供类似于异常处理的东西?没有这些结构我会过得更好吗? 如果有人能用简单的语言向我解释这一点,和/或为这些结构提供一个用例并将它们与我在上面使用的错误处理类型进行比较,我将不胜感激。

最佳答案

返回error更方便值 - 它们可以携带比二值 bool 更多的信息(对客户/用户有利)。

有关 panic/recover 的问题:在某些情况下,它们的使用是完全合理的。例如,在一个手写的递归下降解析器中,通过所有调用级别“冒泡”错误条件是一个很好的 PITA。在此示例中,如果在最顶层 (API) 级别存在延迟恢复,并且可以使用例如

panic(fmt.Errorf("Cannot %v in %v", foo, bar))

关于error-handling - 我用: "defer-panic-recover" or checking "if err != nil {//dosomething}" in golang?哪个比较好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16978316/

相关文章:

php - 为什么升级到Symfony 4.4之后,我不再获得错误预览页面?

php - 如何从 fatal error "Allowed memory size exhausted"中恢复

objective-c - iCloud文件上传错误(NSFileWriteNoPermissionError = 513)

dictionary - 在 golang 中使用私有(private) map 、 slice 的最佳做法是什么?

Golang invopop jsonschema if/then/else 的用法

go - 如何将嵌套结构传递给参数

google-cloud-platform - 谷歌云 TPU 出现紧急错误

asp.net - Log4Net、ThreadContext 和 Global.asax

rust - Rust嵌入式 panic 破坏了堆栈

linux-kernel - 尝试 modprode 驱动程序后出现 "unable to handle kernel null pointer derefernce at null"