请问下 go 语言的错误如何处理

137 天前
 jlak
楼主编程业余爱好者,用的最多的是 JS
一直想学一款编译型语言,写了几天 Go
虽然功能能实现 但是在错误处理方面感觉弄的很差
编码方式基本是写小函数然后组成中函数再组成大函数
这种编程方式不知道叫什么,使用 go 的话应该学习什么编程方式?
在体验的这几天里 最难搞的就是错误处理了
第一次接触这类的错误处理方式
好像是说每个可能出错的函数需要返回 error 或 nil
于是我给可能出错的小函数添加了 error 返回值
于是在中函数里调用这些小函数是不是也需要返回这个 error
然后大函数里调用到会返回 error 的中函数就需要返回 error 层层传递叠加
不知道我有没有解释清楚
2383 次点击
所在节点    Go 编程语言
25 条回复
biu7
136 天前
看你当前层需不需要处理这个错误,需要对特定错误做处理的时候就用 is/as 之类的做判断
povsister
136 天前
需要处理就就地处理,不需要处理的就上抛。如果你觉得没有需要你处理的错误。。
看实际情况吧,举个例子,web 服务,如果业务一路上抛错误,那么到 web server 的 handler 上,它会统一把这个错误处理成 500 Server error ,至于错误内的 stack 信息,完全取决于你自己实现。
DefoliationM
136 天前
是的,跟 c 一样,不过 c 一般返回的 int
kneo
136 天前
你说的编程方式是自底向上。
你说的小函数增加错误返回,中函数大函数也要改,没错。没什么办法,习惯就好了。有经验以后你一开始就会给中函数加上错误返回的签名。
MrVito
136 天前
难道 js 不是这样做的吗?
cmdOptionKana
136 天前
Go 提供了机会给你认真对待每一个错误,严格来说确实应该认真对待,这样晚上睡觉也踏实一点。

但是初学者用 panic 偷懒我觉得也没啥问题。用 panic 就不用层层传递了,直接崩。
bronyakaka
136 天前
go 只能这么处理,准确来说 go 没有设计错误处理机制,被社区内外无数人诟病。不过也有人喜欢这种原始写法就是了。另外 go 的 err 没有堆栈
akiyamaakira
136 天前
“编码方式基本是写小函数然后组成中函数再组成大函数”

实际上不仅仅是编程,这是人类解决各种复杂问题的通用方法,十分有效,可以了解一下其原理,思考和开发效率会更高: https://www.modevol.com/episode/cl4zh80o48f2101o3e2iv849s
lbp0200
136 天前
可以参考大多数 Java 程序员的处理方式,吃掉错误,继续运行
maxwellz
136 天前
基本就是层层返回,如果想比较清晰定位错误,就在返回的时候携带一些信息,或者打日志
jlak
136 天前
谢谢各位 原来我大致的方向已经是正确的
看来只能接受繁琐的错误层层传递
js 转来感觉 1/3 的时间在写 error
1/3 在写 struct
B1acKy1in
136 天前
@jlak 差不多,错误处理被诟病的一大原因就是大量的时间花在了 if err != nil 上了
ruanimal
136 天前
@jlak 大道至简🐶
guanzhangzhang
136 天前
你想想 c 语言的,只能返回值呢
HFX3389
136 天前
if err != nil 当成 try catch 呗
henix
136 天前
这是逼迫你更细致的处理错误,在使用异常的语言中,如果要细致处理错误,代码量并不比 Go 这样的小。

Go 的错误处理思想继承自 C ,有点“程序的性能消耗和代码量成正比”的意思。比如错误不自带堆栈,因为堆栈有性能开销,如果确实需要的话程序员就要手动加,手动加的时候还可以加上更多上下文信息,有时候比异常更好。

个人认为应该将错误分成两类:意料之外的,属于程序 bug 的,直接 panic ;意料之内的用户输入错误,上游 API 错误,用 error 处理。

推荐看看这篇 The Error Model: https://joeduffyblog.com/2016/02/07/the-error-model/
gerefoxing
136 天前
经常有人吐槽 go 这个设计,隔一段时间就能碰见
yazinnnn0
136 天前
go 社区刚刚拒绝了所有关于新增错误处理特性的提案



凑合过呗, 还能离咋地
yazinnnn0
136 天前
zxdstyle
136 天前
个人还是比较喜欢 go 这种错误处理方式的。时刻提醒自己,你写的每行代码都可能出错,就不会有“小函数增加错误返回,中函数大函数也要改”这种情况了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1063312

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX