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

2023-12-22 10:40:03 +08:00
wkong  wkong

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

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

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

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

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

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

3. 不仅仅是多写代码问题
musi
musi
2023-12-22 10:56:46 +08:00
一个函数里面加了十几个 if 就是为了判断程序有没有错。。。
xiangyuecn
xiangyuecn
2023-12-22 11:01:31 +08:00
On Error Resume Next
On Error GoTo 0

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

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

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

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

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

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

© 2021 V2EX