【问题标题】:Golang errors and documentationGolang 错误和文档
【发布时间】:2018-05-31 23:53:55
【问题描述】:

不幸的是,标准库中的 golang 错误文档几乎不存在。例如只是打开一个文件,除了您可以打印一个字符串外,没有记录错误的返回值。但这并不总是正确的处理方式。

有没有办法通过反复试验来确定真正的错误代码可能是什么,而不是仅仅打印出文本?为特定错误匹配整个文本似乎很愚蠢。

例如鉴于我想最终实现这样的目标(假设它是正确的)

if fd, err := io.Open("filename"); err != nil {
  if err != io.ErrFileNotFound {
    log.Fatalf("Error opening file: %s", err)
  }
}

据我所知,任何实现错误接口的东西都可以用作错误。但是确定错误是什么是我正在努力解决的问题。错误可能是一个结构,其中包含其他字段,例如数字字段,告诉我除了文本本身之外它是什么类型的错误。 但是如果没有查看许多源文件,有时还需要查看数十个函数调用,我怎么知道错误包含哪些其他数据。

这有意义吗?

作为一个更实际的例子。我正在使用 yaml 库来加载配置文件。 如果配置文件不存在,我想继续(它将使用默认值)。但是,如果存在权限错误,我希望将该错误视为致命错误。问题是,不完全清楚错误会提前是什么样子。

【问题讨论】:

  • 作为库作者,您是在寻求指导,还是在抱怨 io 包的 API?如果是前者,您可以导出自定义错误变量,例如var TheWorldHasEnded = errors.New("The world has ended");然后客户端代码将能够测试他们得到的错误是否是那个错误:if err == foo.TheWorldHasEnded {...}
  • 两者兼而有之。我希望我能够打印出每一个细节的错误。例如,您可以使用 fmt.Printf("%+v\n", structvar) 打印结构。但是使用错误你不能,所以我没有什么可以匹配的,但文本或跟踪通过数十个函数调用查看库文档或 io 包文档或任何地方不存在的文档的源代码。你明白我的意思吗。如果我至少可以得到一个 int 变量,我会有更有用的东西。或者,如果某处存在大量错误代码
  • 我同意你的观点,图书馆作者本可以使用更具体的错误类型,但选择不这样做。此外,很少有标准化的跨包错误,除非绝对必要,否则很少记录使用中的错误。
  • 标准库中的错误文档通常非常出色。但是标准库中有很多包,所以很难准确地知道你在说什么。在 io 库中,有 IMO reasonable error documentation
  • @Flimsy - 错误的文档有点薄。如果我们不知道哪些函数返回哪些错误,那么我们最终可能会处理永远不会返回的错误,这浪费了编写时间。来自 C 世界,我通过手册页确切地知道每个函数可能返回哪些错误。这就是缺少的。 IMO,文档可能需要一些工作。

标签: go runtime-error


【解决方案1】:

使用os.IsNotExist 检查文件未找到错误:

f, err := os.Open("filename")
if os.IsNotExist(err) {
  // handle missing file
} else if err != nil {
  // handle other errors
}

函数os.IsExistos.IsPermissionis.Timeout 检查其他常见类型的错误。

osio 和其他包为特定错误声明变量。

【讨论】:

  • 所以基本上是猜的。好的。
  • 该软件包记录了这四个功能及其用途。问题中的 YAML 场景由 os.IsNotExist 和 os.IsPermission 这两个函数涵盖。
  • 谢谢。真的和我想的一样可怕。显然,当我测试 os.IsNotExist 时,库 os 和 io 和 ioutil 不会返回兼容错误,但是在由看起来像是在使用 ioutil 的库打开的文件上失败。抱歉,我犯了一个错误,我使用的是 toml 库而不是 yaml,但没关系。
  • io 和 ioutil 包返回兼容错误。问题中的代码没有引用实际函数或 ioutil 包。它将帮助您描述您遇到的具体问题(您正在调用哪个函数、您得到了什么、您期望什么等)。
  • 可以使用开关:switch err { case os.IsNotExist(err): // do something; case os.IsPermission(err): // do somethining ; case err != nil: // do something }
【解决方案2】:

如果您不了解某个库,请务必查看 godoc。 .below 是 godoc io URL 和阅读更多

https://godoc.org/io

【讨论】:

  • 这就是缺少一半可以返回的错误的文档。 :(
  • @Matt:具体来说,缺少什么? “文档很糟糕”和“遗漏了一半的错误”不是具体的投诉/问题。
猜你喜欢
  • 2012-05-31
  • 2010-12-18
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多