【发布时间】:2019-09-20 10:39:06
【问题描述】:
更新:我认为现在这个问题没有普遍的答案。我们可以使用答案中解释的技术返回这两个错误。我认为这里最重要的是不要忘记我们有两个错误的情况并以某种方式处理它。
注意:关于如何从延迟函数返回错误有很多关于 SO 的问题。这不是这里的问题。
(在 Go 中)当函数已经返回错误时,从延迟函数返回错误的正确方法是什么。对于example
func errorMaker() (err error) {
defer func() {
err = errors.New("Deferred error")
}()
err = errors.New("Some error")
return
}
func main() {
err := errorMaker()
fmt.Printf("Error: %v\n", err)
}
在上面的代码中,延迟函数返回的错误覆盖了函数返回的错误。返回两个错误的规范方法是什么?如果另一个程序员使用我的函数,当函数返回“两个错误”时,她会从函数中得到什么结果?
我应该为此使用Error wrapping 吗?
补充说明:
- 正如@Volker 在他的评论中所说,我为此错误编写了一些特定于应用程序的处理。因为我知道根据错误的性质应该做什么。
- 我想我的问题是 - 如果我想从函数中返回所有错误,在我的场景中将它们组合起来的最佳方法是什么?
【问题讨论】:
-
根本没有统一的通用答案。这完全取决于你的问题。甚至可能需要返回两个错误(尽管 非常 不太可能)或一个带有两个潜在错误的错误或中止程序(而不返回)或返回第一个或第二个或二进制文件或两者.没人知道。
-
@Volker 感谢您的回复!是的,这真的取决于应用程序。无论如何,我认为应该有一些共同的方法来解决这类问题。这就是为什么我问是否有人在 Go 编程方面比我更有经验,可以分享他们是如何做到这一点的。完美的团队成员致力于 Go 2.0 带来的新的 Go 错误处理。我不想自己发明一些东西,而是应用一些常见的做法。
-
Go 2 还很遥远。不要指望它喷气机有什么。现在不要计划使用可能会出现或不会出现的东西。可能没有 Go 2。更有经验的建议是:处理错误必须如何完成。在 finally 块中处理错误也是如此:没有人可以告诉你:“在任何 finally 块中处理所有这样的错误,因为......”
标签: go