首页 > 解决方案 > 创建专用函数是处理错误的好方法吗

问题描述

我最近看了Liz Rice 的这个演讲(我强烈推荐!),我看到了,而不是写:

func main() {
    if err := someFunc(); err != nil {
        panic(err)
    }
}

她这样做:

func main() {
    must(someFunc())
}

func must(err error) {
    panic(err)
}

这是处理错误的惯用方式吗?IMO 它并没有提高可读性,我觉得它没有遵循Go 谚语“清晰胜于聪明”。你怎么看?

标签: goidioms

解决方案


该模式在运行时可能MustXXX(error)出现时很有用,但它是否确实在编译时决定。这意味着如果源代码是它应该是的,错误将不会在运行时发生。error

闪亮的例子是template.Must()regexp.MustCompile()。如果您在源代码中提供了有效的模板或有效的正则表达式,则在运行时解析它们将永远不会失败。在这些情况下,使用Must()会产生更短更清晰的代码。应提供测试以检测源中是否使用了无效的模板或正则表达式,以便及早检测到错误(运行测试时)。

除此之外(当基于运行时条件(如用户输入、从外部源读取的数据等)可能发生错误时),Must()显然不建议使用该模式,您应该正确处理错误。

参见相关:单值上下文中的多个值


推荐阅读