个人觉得 Go 的 error 设计的非常好,为什么还那么多人吐槽?

336 天前
 wkong

一个程序是否健壮,主要判断是是否对异常有精准处理。

像 Java 异常的处理虽然少写了代码,但是增加了未知性。

Go 虽然多了一些代码,但是很容易写出健壮性的程序。孰轻孰重这不是很明显吗?

18346 次点击
所在节点    程序员
156 条回复
CrazyMonkeyV
336 天前
你对 JAVA 的异常处理有误解。
dongtingyue
336 天前
javar 比较多他们习惯自己那一套,用其他语言就爱用原来的套到新的上面。
wkong
336 天前
@CrazyMonkeyV 什么误解?我也做过几年的 Java 开发
mars2023
336 天前
Java 的异常,应该对比 go 的 Panic 吧。
wkong
336 天前
@mars2023 不是,Java 的崩溃异常才能对应 Go 的 Panic
Goooooos
336 天前
你说的都对
Maboroshii
336 天前
我比较喜欢 python 的异常,没有个 10 层缩进那叫写代码吗? doge
Ayanokouji
336 天前
1. go 的 error 类型太弱,只能靠字符串判断
2. 多层 error ,如果直接返回,溯源太难(原生 error 无调用栈),如果追加信息,就会有 1 的问题,是什么错误类型难判断
3. 如果不介意多代码,java 完全可以全部是 checked exception ,自带类型和调用栈
nagisaushio
336 天前
因为本可以更好,rust 和 go 的异常原理是一样的,但 rust 的语法糖就很香。但凡 go 多个语法糖也不会这么多人吐槽
pursuer
336 天前
虽然不知道第几次看到类似讨论了...throw catch 是一种函数多级退出的在控制流上语法糖,go 里对应的是 panic ,Java 你写个 return Multivalue<Result,Error?>也不是不行
cyp0633
336 天前
离 rust 就缺那么一点儿
zihuyishi
336 天前
其实这个错误处理很早的时候 windows 的 com 组件就是这么设计的,所有的 com 相关 c++接口都返回一个 HRESULT 需要处理,然后这个 HRESULT 在 c#和 vb 这种语言表现就是抛异常。包括后来 javascript 的 promise 也是差不多,最开始是.catch()处理,在 async 函数里就是 try catch
golang 比较特别的其实在于你不好忽略一个 error ,不处理编译不通过,直接用'_'忽略 static check 也会抱怨,导致用户不得不处理这个错误,虽然有些烦,但是我认为是很好的设计。反倒是之前太多人错误处理都太草率了
wkong
336 天前
@Ayanokouji

1. try catch 判断比字符串判断高级些吗?越简单明了的设计反而是好的设计。

2. 多层 error ,可以在最底层的 error 打个 log ,就知道来源了

3. 不仅仅是多写代码问题
musi
336 天前
一个函数里面加了十几个 if 就是为了判断程序有没有错。。。
xiangyuecn
336 天前
On Error Resume Next
On Error GoTo 0

@Maboroshii 那就不得不提上古时期的 vb 语法了,搁现在也是很优雅的,比 python 的强制缩进好看 100 倍 至少人家还有 end 明确收尾😅
rrfeng
336 天前
感觉就缺个枚举类型
如果有,可以把业务 error 都用枚举写出来,就不存在字符串判断的问题。
MoYi123
336 天前
其实是认为 resp, err 这样的写法有 4 种情况
1. nil, err
2. nil, nil
3. resp, err
4. resp, nil

而实际上只有 1 和 4 是比较标准的格式, 没有在语言层面上禁止 2,3 这 2 种写法, 虽然我觉得根本无所谓.
Ayanokouji
336 天前
@wkong 你去看看多少代码 if err!=nil 直接 return 的,一个业务那么多 error ,怎么确定哪个是底层已经打印日志了。
调用其他同事的方法,难道还要去看看他写的源码,error 返回的是啥,看看 fmt.errorf("")里边写的啥?
cmdOptionKana
336 天前
@musi 如果认为没必要判断处理,完全可以让它 panic ,并非全部错误都要特殊处理。语言是死的,人是活的。
ho121
336 天前
有人写过 C 语言中的错误处理吗?

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

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

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

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

© 2021 V2EX