我想知道...我前段时间读过关于围棋的文章,我试着在里面编些程序.我看起来挺有趣的.但是我已经到了handling "exceptions" in this language岁了.我读过关于他们的方法,这似乎是合理的.我想知道与围棋的风格相比,标准的例外方法有什么优势?好处和坏处是什么?

Edit直截了当地说:我不想就例外进行任何圣战.我只是想知道这种处理错误的方式是否有任何优势?与标准例外相比,这种风格的实际优势是什么?这值得一想吗?

推荐答案

panic /恢复在道德上等同于try /捕获异常.有表面的差异(语法)和微妙但重要的预期用途差异.

通常,对异常问题的最佳解释是"Cleaner, more elegant, wrong",这很好地概括了异常与返回错误代码的优缺点.

围棋设计人员认为,通过从函数返回错误代码来处理错误是惯用的围棋方式,并且该语言支持多个返回值以使其在语法上更简单.虽然提供了死机/恢复,但区别不在于功能,而在于预期用途.

其他expose 异常的语言促进了它们的使用,在实践中它们经常被使用(有时甚至被误用).

GO不鼓励使用panic /恢复.你可以这样做,但是你应该只在非常有限的情况下这样做.

如果你看看Go自己的标准库,大多数uses of panic个用于发出致命错误的信号,要么指示库代码中的内部错误(即bug),要么使用错误的数据调用库(例如,将非json数据传递给json解码函数).

但是,正如您所链接的文章所指出的:"Go库中的约定是,即使包在内部使用Panic,其外部API仍然提供显式的错误返回值."

这与C语言、java、python或C++语言不同,其中很多标准库代码都会给信号错误抛出异常.这些语言希望您使用异常.Go不鼓励使用panic /恢复.

总结一下:

  • 惯用的GO风格是使用错误代码告诉调用者有关错误的信息
  • 仅在极少数情况下使用panic /恢复:

在实践中,重要的是使用语言的惯用风格.在围棋中,返回错误代码,避免panic /恢复.在C#中,使用异常来表示一些错误.

Go相关问答推荐

你能帮我优化一个golang代码关于函数CrossPointTwoRect

理解Golang并发:缓冲通道的意外行为

为什么工具链指令在这种情况下没有效果?

由于索引器压缩比限制,扫描包含golang包的图像时,伪影XRAY失败

../golang/pkg/mod/github.com/wmentor/lemmas@v0.0.6/processor.go:72:9:未定义:令牌.进程

Python样式生成器实现为通道:过早读取

在运行时更改 Go lang slog 的日志(log)级别

在 GoLang 中对自定义 struct 体数组进行排序

Golang prometheus:有没有办法衡量出站请求的指标?

xml.Unmarshal 不支持的类型 struct

Gorm delete with clauses sqlmock 测试

如何仅提取时间作为持续时间

Go 中的 HTTP 请求验证中间件

如何修改go gin的默认端口?我的 8080 端口正在使用中

使用go doc命令查看示例函数?

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

如何在 Windows 中使用 github.com/AllenDang/giu 和 github.com/gordonklaus/portaudio 构建 GO 程序

如何排除溢出矩阵的坐标

将基本 HTTP AUth 用户/密码凭据存储在 GO 中,无需外部包

Beego - 我需要context.Context而不是 Beego 上下文