我想知道......我前段时间读过关于Go的内容,我尝试在其中编程。我觉得很有意思。但我已达到handling "exceptions" in this language。我已经阅读了他们的方法,这似乎是合理的。我想知道标准特殊方法相比Go的风格有什么优势?有什么优点和缺点?
编辑要直截了当:我不想对例外进行任何神圣的战争。我只是想知道这种处理错误的风格是否有任何优势?与标准例外相比,这种风格的实际优势是什么?是否值得怀疑?
答案 0 :(得分:51)
一般情况下异常问题的最佳解释是"Cleaner, more elegant, wrong",这是对异常与返回错误代码的利弊的良好概述。
Go设计师决定通过从函数返回错误代码来进行错误处理是惯用的Go方式,并且语言支持多个返回值以使其在语法上更容易。虽然提供了恐慌/恢复,但差异不是功能性而是预期用途。
其他暴露异常的语言促进了它们的使用,在实践中它们经常被使用(有时甚至被滥用)。
劝阻不要使用恐慌/恢复。你可以这样做,但你只能在非常有限的情况下这样做。
如果你看看Go自己的标准库,大多数uses of panic用于发出致命错误,指示库代码中的内部错误(即错误)或使用错误数据调用库(例如,传递非json数据到json解码函数)。
但正如您链接的文章所指出的那样:“Go库中的约定是,即使包在内部使用panic,其外部API仍然会显示明确的错误返回值。”
这与C#,Java,Python或C ++等语言不同,其中许多标准库代码可能会引发异常信号错误。这些语言希望您使用异常。劝阻不要使用恐慌/恢复。
总结:
在实践中,重要的是使用语言的惯用语。在Go中返回错误代码并避免恐慌/恢复。在C#中,使用异常来表示一些错误。