Go语言中与'throws'子句相当的内容是什么?

5

我正在学习Go编程语言。我刚刚了解了Go中的错误处理方式。有一个很好的解释,但是我对此有些困惑。 在Go中典型的处理错误的方式就是将错误作为函数的第二个返回值:

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

非常简单。但是假设我是一个库开发人员,我可能想知道客户端是否可以抛出一些错误并且客户端必须处理它。
在Java中,我有“throws”子句。因此,客户端必须将其放入那些“try...catch”块中。
在Go中,我可以从函数中返回错误;但是,假设库的客户端避免处理它,那么我该如何优雅地告诉他处理它?
编辑:我只是在探索一种语言。不试图将Java的思想与Go混合,并尊重每个人的做法。我只是问因为我想知道是否有任何关键字,因为我还没有很好地学习Go。

1
这就是Go语言的哲学:如果开发者看到函数返回了一个错误,那么他就有责任去检查它。编程语言不会强制你这样做。 - W.K.S
4
Java独有的特性是Checked exceptions,其他编程语言没有。换句话说:除了Java以外,Go或其他任何编程语言都没有与throws子句等价的功能。 - Jesper
3
在 Go 语言中,返回值中有一个是错误信息表明该函数不能保证一定成功执行。虽然这对于 Java 开发者来说可能感到奇怪和过于乐观,但你会逐渐适应的。对我而言,我一直讨厌异常处理,因为它们必须在每个嵌套级别都进行处理。 - W.K.S
4
“这是主观的,所以我能提供的唯一真正建议就是‘不要用Go语言写Java代码’。” - JimB
1
@JimB 不,我只是在探索一种语言。并不想把Java的思维与Go混合,并尊重每个人做事的哲学。我之所以问,只是因为我想知道是否有任何关键字,因为我还没有很好地学习Go。 - Krupal Shah
显示剩余2条评论
2个回答

9

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

如果你真的想要具有类似Java的行为,可以使用panic(),但请注意,在Golang中,panic只应用于无法恢复的错误或程序员错误(而不是可以从运行时错误中恢复的错误)。

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


7
这就是Go语言的哲学:如果开发者看到一个函数返回了错误,那么他有责任检查这个错误。编程语言不会强制你这样做。Rob Pike认为错误并不特殊,因此没有必要使用专门的语言结构(如try/catch)来处理它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接