3

我制作了一个大型程序,可以打开和关闭文件和数据库,对它们执行写入和读取等等。由于没有“go 中的异常处理”之类的东西,并且由于我并不真正了解“defer”语句和“recover()”函数,因此我在每次打开文件、读写、数据库条目后都应用了错误检查等等。

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

为此,我在开始时将 db_updation_status 定义为“假”,并且在程序中的一切正常之前不要将其设为“真”。在我认为可能出错的每个操作之后,我在每个功能中都这样做了。

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

4

3 回答 3

6

返回错误值更方便 - 它们可以携带更多信息(对客户/用户有利),而不是两个值bool

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

panic(fmt.Errorf("Cannot %v in %v", foo, bar))
于 2013-06-07T07:42:38.197 回答
2

如果一个操作可能失败并返回一个错误,那么立即检查这个错误并正确处理它在 go 中是惯用的,检查是否有任何事情得到正确处理很简单而且很好。

不要对此类事情使用延迟/恢复:所需的清理操作很难编码,尤其是在内容嵌套的情况下。

于 2013-06-07T07:43:07.430 回答
1

向调用者报告错误的常用方法是将错误作为额外的返回值返回。规范的 Read 方法是一个众所周知的实例;它返回一个字节数和一个错误。但是,如果错误无法恢复怎么办?有时程序根本无法继续。为此,有一个内置函数 panic,它实际上会创建一个运行时错误,从而停止程序(但请参阅下一节)。该函数采用任意类型的单个参数(通常是字符串)在程序终止时打印。这也是一种表示不可能发生的事情的方法,例如退出无限循环。

http://golang.org/doc/effective_go.html#errors

于 2013-06-08T05:26:36.713 回答