Google Go语言中的异常处理

时间:2011-08-25 22:39:54

标签: exception-handling go

我想知道......我前段时间读过关于Go的内容,我尝试在其中编程。我觉得很有意思。但我已达到handling "exceptions" in this language。我已经阅读了他们的方法,这似乎是合理的。我想知道标准特殊方法相比Go的风格有什么优势?有什么优点和缺点?

编辑要直截了当:我不想对例外进行任何神圣的战争。我只是想知道这种处理错误的风格是否有任何优势?与标准例外相比,这种风格的实际优势是什么?是否值得怀疑?

1 个答案:

答案 0 :(得分:51)

恐慌/恢复在道德上等同于尝试/捕获异常。有明显的差异(语法)和预期用途的微妙但重要的区别。

一般情况下异常问题的最佳解释是"Cleaner, more elegant, wrong",这是对异常与返回错误代码的利弊的良好概述。

Go设计师决定通过从函数返回错误代码来进行错误处理是惯用的Go方式,并且语言支持多个返回值以使其在语法上更容易。虽然提供了恐慌/恢复,但差异不是功能性而是预期用途。

其他暴露异常的语言促进了它们的使用,在实践中它们经常被使用(有时甚至被滥用)。

劝阻不要使用恐慌/恢复。你可以这样做,但你只能在非常有限的情况下这样做。

如果你看看Go自己的标准库,大多数uses of panic用于发出致命错误,指示库代码中的内部错误(即错误)或使用错误数据调用库(例如,传递非json数据到json解码函数)。

但正如您链接的文章所指出的那样:“Go库中的约定是,即使包在内部使用panic,其外部API仍然会显示明确的错误返回值。”

这与C#,Java,Python或C ++等语言不同,其中许多标准库代码可能会引发异常信号错误。这些语言希望您使用异常。劝阻不要使用恐慌/恢复。

总结:

  • 惯用Go样式是使用错误代码告诉来电者有关错误的信息
  • 仅在极少数情况下使用恐慌/恢复:
    • 在遇到指示代码中的错误的内部不一致时“崩溃”您的程序。它基本上是一种调试辅助工具。
    • 如果它大大简化了代码中的错误处理(但如果代码要被其他人使用,请不要将此类恐慌暴露给调用者)。

在实践中,重要的是使用语言的惯用语。在Go中返回错误代码并避免恐慌/恢复。在C#中,使用异常来表示一些错误。