【问题标题】:Is creating a dedicated function a nice way to handle errors [closed]创建专用函数是处理错误的好方法[关闭]
【发布时间】:2021-05-30 17:43:36
【问题描述】:

我最近看了this talk by Liz Rice(我强烈推荐!),我看到了而不是写:

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

她做到了:

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

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

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

【问题讨论】:

  • 提供的通用函数不是惯用的,但是即使在标准库中也有一些包提供Must func 来简化初始化,例如参见html/template
  • 我认为您必须考虑 如何 使用 must() 函数。它用于与幻灯片/实时编码交谈的上下文中,因此尽可能简洁很重要。另一方面,在生产中,随机恐慌不是一个好主意:-)
  • 是的,我想在实时编码时使用must() 更容易:)
  • 如果恐慌是“处理”这些类型的“错误”的正确方法,那么是的,如果不是,那么不是。

标签: go idioms


【解决方案1】:

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

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

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

查看相关:Multiple values in single-value context

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2019-06-17
    • 1970-01-01
    • 2023-03-11
    • 2019-03-25
    • 2021-12-15
    • 2019-01-27
    相关资源
    最近更新 更多