Error handling 哪一个对我来说更合适;“延迟恐慌恢复”;或“检查”;如果出错!=无{//dosomething}”;在戈兰?

Error handling 哪一个对我来说更合适;“延迟恐慌恢复”;或“检查”;如果出错!=无{//dosomething}”;在戈兰?,error-handling,go,panic,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 } 为此,我在

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

_,insert_err := stmt.Run(query)
if insert_err != nil{
    mylogs.Error(insert_err.Error())
    return db_updation_status
}
为此,我在开始时将db_updateion_status定义为“false”,并在程序一切正常之前不将其设置为“true”。 我在每一个功能中都这样做过,在我认为可能出错的每一个操作之后

您认为有没有更好的方法使用延迟恐慌恢复来实现这一点?我在这里读到了这些,但不清楚如何使用它们。这些构造是否提供类似于异常处理的功能?没有这些结构我会更好吗? 如果有人能用一种简单的语言向我解释这一点,和/或为这些结构提供一个用例,并将它们与我上面使用的错误处理类型进行比较,我将不胜感激。

返回值更方便-它们比两值
bool
能携带更多的信息(对客户端/用户更有利)

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

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

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


不要使用“延迟/恢复”来处理这些事情:所需的清理操作很难编码,尤其是当东西嵌套时。

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


非常感谢您的帮助!我最初是这样做的,但后来了解了延迟/恢复,并感到困惑。软件包的另一个礼仪说明:软件包不应该“泄漏”恐慌,而应该总是从函数调用返回错误。如何处理包内的事情是你的选择,jnml的建议是一个很好的方法。你应该检查一下——他的解决方案根本不使用panic/defer,而且非常优雅和可读。@silas:递归下降解析器不是词法分析器。完全不同的问题。