`Exit(1)` 在哪里,return 错误在哪里?
Where to `Exit(1)` and where to return error?
处理发生在程序层深处的错误的惯用方法是什么?如果我在包裹深处的某处有这样的片段:
file, err := os.Open(path)
if err != nil {
os.Exit(1) // or return errors.New("The path is invalid.")
}
我应该 return 一个错误并可能将它拖过几个层 if {} else {}
块到 main
和 Exit
在 main
或 Exit
马上?
直接 Exit
代码看起来更清晰、更易读。但有时很难测试。使用 returns 和检查代码看起来更糟(在我看来)但它更容易测试并达到 100% 的覆盖率。
还有一个问题...如果我正在编写一个包并且它没有 main
功能,我应该将 Exit
留给 "user" 程序并且只是 return 错误?
基本上你最好就地处理错误,而不是通过药物来解决。当您需要立即退出时,您也可以调用 os.Exit()
。你忘记了另一个选项 - panic()
。它遍历并评估延迟函数,允许您进行一些拆解。在编写包时,不建议调用 os.Exit()
或 panic()
以免用户因无法预测而感到困惑。在包中提升错误是最好的选择。
处理发生在程序层深处的错误的惯用方法是什么?如果我在包裹深处的某处有这样的片段:
file, err := os.Open(path)
if err != nil {
os.Exit(1) // or return errors.New("The path is invalid.")
}
我应该 return 一个错误并可能将它拖过几个层 if {} else {}
块到 main
和 Exit
在 main
或 Exit
马上?
直接 Exit
代码看起来更清晰、更易读。但有时很难测试。使用 returns 和检查代码看起来更糟(在我看来)但它更容易测试并达到 100% 的覆盖率。
还有一个问题...如果我正在编写一个包并且它没有 main
功能,我应该将 Exit
留给 "user" 程序并且只是 return 错误?
基本上你最好就地处理错误,而不是通过药物来解决。当您需要立即退出时,您也可以调用 os.Exit()
。你忘记了另一个选项 - panic()
。它遍历并评估延迟函数,允许您进行一些拆解。在编写包时,不建议调用 os.Exit()
或 panic()
以免用户因无法预测而感到困惑。在包中提升错误是最好的选择。