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

335 天前
 wkong

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

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

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

18342 次点击
所在节点    程序员
156 条回复
emSaVya
335 天前
@wkong EAFP LBYL 两种风格罢了。有什么高下之分吗?

而且 try exception 明显是更优雅的方案, 只不过会带来一些开销。
littlewing
335 天前
写 C/C++ 的都没说什么呢?
大部分 C++ 工程代码是不会用 exception 那一套的
mightybruce
335 天前
因为大多数这种人都是写 java 的,喜欢这种 try catch 异常处理, 对于非业务开发,懒散和滥用 try catch 处理可以导致致命的 bug ,
linux 内核 和 c 那么多库都没有 try catch, 方式比 go 还原始也没啥人说什么,都是业务开发太闲了。
go 的哲学就是 错误就是要显示检查处理的,异常处理的不可见错误检查所带来的问题其实是很大的。不少业务开发才不管那么多,还不是能跑就行,最多加个单元测试。
nomagick
335 天前
你对“设计”这个词是不是有什么误解...

Golang 的异常处理只能说是没有设计,而不能说是设计得好或设计得不好
Goooooos
335 天前
@mightybruce try catch 不是 java 特有,python ,c#,javascript 都有
hedwi
335 天前
你说得对 很多人其实并没有处理所有的可能出现的错误
xiuxian
335 天前
@littlewing 我写 C++也基本不用,exception 使用起来是为了取代返回多个错误码,一个个的去判断。 实际上不能像 java 和 go 一样,全局捕获异常。该 carsh 还是得 carsh.
xiuxian
335 天前
crash
mightybruce
335 天前
另外 try catch exception 还涉及到 RAII 机制,go 连对象都没有,谈 try catch 在 go 里面是没什么意义的,最多也只是语法糖。
CloveAndCurrant
335 天前
其实 go 的 error 相比 rust 的最大缺陷就是不能自动传导,rust 使用?就可以将 error 传导到函数最终结果,go 需要手动才能做到。
joycelin
335 天前
是这样的,以前也说不需要泛型,我看以后新的错误处理方式出来了你再怎么说
gitrebase
335 天前
@Ayanokouji #18 写 Go 一般在最外层打日志吧,比如在 handler ;“if err!=nil 直接 return”在我的工作经历中,几乎不会有这样的代码,多少都会带点上下文
CloveAndCurrant
335 天前
@CloveAndCurrant 除了 rust ,java ,Python 这些都可以做到将异常自动传导的
chendy
335 天前
看具体工作内容吧
要是写什么底层逻辑这套东西可能是好用的(因为我没写过)
但是写业务弄这么复杂的错误处理逻辑,系统和开发必死一个
mcfog
335 天前
你看,即使在这楼里偏支持的声音,也有挺多并不太理解比较现代的那一版 errors.Is/As 新设计,还有如何结合 golang 偏鸭子类型的 interface 设计做复杂 error 交互的同学的。所以我是觉得 Golang 的 error 设计唯一的问题就是可能低估了大家学习一个和传统非常不一样(但是确实精妙)的设计这件事情的成本。

也包括相关的 interface 设计,至少我感觉多数人都要教,而且教了以后也不像其他概念基本一次性掌握,得反复 review 。
june4
335 天前
一般程序中很少处理异常,都是默认往上抛,直到顶层处理,比如直接返回 5xx 错误,所以 java 这种就不干扰正常代码。

少量函数天生大概率需要就近处理异常,这些函数你再用错误码也不迟,比如我最近看的 js 验证处理库每个函数都有二个版本,一个是 xxx()抛异常,一个是 safeXXX()无异常会 return 错误码,这不二全了吗
mcfog
335 天前
@june4 现在有了 generic 可以搞一个非常棒的 helper

func Must[T any](v T, err error) T {
if err != nil {
panic(err)
}
return v
}

就是泛化的 https://pkg.go.dev/html/template#Must
boboaiya3
335 天前
@wkong #13
boboaiya3
335 天前
@wkong #13
try catch 判断比字符串判断高级些吗?越简单明了的设计反而是好的设计
zhanshen1614
335 天前
大多数人习惯 try catch 捕获异常肯定会觉得 go 的异常处理不方便。go 的异常处理比较麻烦但很详细可以知道是哪个步骤错误,阅读更清晰。try catch 捕获异常要考虑 exception 的从属关系,而且抛出异常也不一定知道是哪里执行错了还得看报错的文件、所在行,需要借助错误日志定位问题。

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

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

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

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

© 2021 V2EX