【问题标题】:What is Go's equivalent to 'throws' clause?Go 相当于“抛出”子句是什么?
【发布时间】:2016-10-23 11:41:42
【问题描述】:

我只是在学习Go programming language。我刚刚读到error handling in Go的方式。有一个很好的解释,但我对此有些困惑。 Go 中处理错误的典型方式只是将错误作为函数的第二个值返回:

f, err := Sqrt(-1)
if err != nil {
    fmt.Println(err)
}

非常简单。但是假设我是一个库开发人员,我可能想知道我的函数可能会抛出一些错误的客户端,客户端必须处理它。

在 Java 中,我有 throws 子句。所以,客户必须把它放在那些try...catch 块中

在 Go 中,我可以从函数返回错误;但是假设图书馆的客户避免处理它,那么我该如何优雅地告诉他处理它?

编辑: 我只是在探索一种语言。不要试图将 Java 的思想与 Go 混为一谈,并尊重每个人的做事哲学。我只是问,因为我还没有学好Go,所以我想知道是否有任何关键字。

【问题讨论】:

  • 这就是 Go 的哲学:如果开发人员看到函数返回错误,那么他有责任检查它。编程语言不会强迫你这样做。
  • 检查异常是 Java 独有的特性,其他编程语言都没有。换句话说:在 Go 或除 Java 之外的任何其他编程语言中,没有与 throws 子句等效的语句。
  • @KrupalShah:在 Go 中,返回值之一是错误的事实表明该函数不能保证成功。我可以理解这感觉很奇怪而且过于乐观,尤其是对于 Java 开发人员来说,但你会习惯的。对我来说,我一直讨厌异常,因为它们必须在每个嵌套级别进行处理。
  • @KrupalShah:这是主观的,所以我能提供的唯一真正的建议是“不要在 Go 中编写 Java”
  • @JimB 不,我只是在探索一种语言。不要试图将 Java 的思想与 Go 混为一谈,并尊重每个人的做事哲学。我只是问,因为我还没有学好Go,所以我想知道是否有任何关键字。

标签: java exception go exception-handling throws


【解决方案1】:

您的库还应该通过其公开的函数将错误传回。您会注意到 std 库中的许多方法都有返回值和错误,因此人们应该习惯于处理错误。

如果你真的想要看起来类似于 java 的行为,你可以使用 panic(),但注意 golang 中的 panic 只能用于不可恢复的错误,或程序员错误(不是可以从中恢复的运行时错误)

无论哪种方式,您都不能强迫客户处理它。这是他们的责任。

【讨论】:

    【解决方案2】:

    这就是 Go 的哲学:如果开发人员看到函数返回错误,那么他有责任检查错误。编程语言不会强迫你这样做。

    Rob Pike 的理由是错误并不特殊,因此不需要专门的语言结构(即try/catch)来处理它们。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多