Google Go语言中的异常处理[已关闭]

t5fffqht  于 2023-01-06  发布在  Go
关注(0)|答案(1)|浏览(110)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

昨天关门了。
Improve this question
我想知道......我以前读过一些关于Go语言的文章,我试着用它来编程。我看起来很有趣。但是我已经达到了handling "exceptions" in this language。我读过他们的方法,看起来很合理。我想知道标准例外方法相对于Go语言的风格有什么优点?优点和缺点是什么?

编辑要保持直线:我不想对异常进行任何圣战。我只是想知道这种处理错误的风格是否有任何优点?这种风格相对于标准异常的实际优点是什么?是否值得怀疑?

oxiaedzo

oxiaedzo1#

panic/recover在道德上等同于try/catch异常。2有表面的区别(语法)和微妙的,但重要的,预期用途的区别。
一般来说,对异常问题的最好解释是"Cleaner, more elegant, wrong",这很好地概述了异常与返回错误代码的利弊。
Go语言的设计者认为通过函数返回错误代码来处理错误是Go语言的惯用方法,并且语言支持多个返回值以使其在语法上更简单。虽然提供了panic/recover,但区别不是功能而是用途。
其他公开异常的语言促进了它们的使用,并且在实践中它们被频繁使用(有时甚至被误用)。
Go语言不鼓励使用panic/recover,你可以这么做,但只能在非常有限的情况下使用。
如果你看一下Go语言自己的标准库,大多数uses of panic都是用来通知致命错误的,要么是库代码中的内部错误(即bug),要么是用错误的数据调用库(例如,将非json数据传递给json解码函数)。
但正如你链接的文章所指出的:Go语言库中的约定是,即使包在内部使用了panic,其外部API仍然会显示显式的错误返回值。
这与C#、Java、Python或C++等语言不同,在这些语言中,很多标准库代码都会抛出异常来提示错误,这些语言希望你使用异常,而Go语言则不鼓励使用panic/recover。
总结如下:

  • Go语言的惯用风格是使用错误代码告诉调用者错误
  • 仅在极少数情况下使用panic/recover:
  • 当遇到内部不一致时,"崩溃"你的程序,这表明你的代码中有错误。它基本上是一个调试辅助工具。
  • 如果它显著地简化了代码中的错误处理(但是如果代码将由其他人使用,则永远不要向调用方暴露这样的异常)

在实践中,最重要的是使用语言的惯用风格。在Go语言中,这是返回错误代码和避免死机/恢复。在C#中,这是使用异常来指示一些错误。

相关问题