Go 为什么不能采用抛出错误的方式处理错误

2020-12-31 17:54:14 +08:00
 geebos

如题,Go 为什么不采用类似 Java 的抛出错误的错误处理方式。现在这种错误处理太麻烦了,一个函数一半是在做错误处理。

2804 次点击
所在节点    问与答
26 条回复
dilu
2020-12-31 17:56:24 +08:00
真·月经帖
jazzychai
2020-12-31 17:56:48 +08:00
不想处理就 _ 啊
shoaly
2020-12-31 17:58:53 +08:00
.....其实 这个错误和 java 新手的通篇 try catch 是一样一样的
geebos
2020-12-31 18:00:14 +08:00
@jazzychai 我指的不是不想处理,是需要把错误集中在调用的函数去处理
wunonglin
2020-12-31 18:02:00 +08:00
不要带着 java 的感觉去用 go
BeautifulSoap
2020-12-31 18:02:51 +08:00
@geebos 我寻思这个需求和你用不用 go 的错误处理没关系啊
geebos
2020-12-31 18:03:36 +08:00
@shoaly 我指的不是这个,我的烦的是要手动处理和返回错误,Java 至少出错会自动抛出。
shoaly
2020-12-31 18:06:13 +08:00
明白了, java 你写的时候 一般 ide 会帮你 throw 异常, go 这个缺了
geebos
2020-12-31 18:08:55 +08:00
@shoaly 什么 IDE,你是不是对 Java 有什么误解,throw 异常是 Java 做的,和 IDE 没关系。
geebos
2020-12-31 18:23:57 +08:00
@BeautifulSoap 我就是想用错误处理啊,但是 Go 没有。现在的方案全部要手动 wrap,一排代码下来,每一个函数调用都要写几行错误处理的代码,我心态炸了呀。
cnbattle
2020-12-31 20:43:19 +08:00
不是处理,用 recover 捕捉也行啊
BeautifulSoap
2020-12-31 20:54:12 +08:00
@geebos "Java 至少出错会自动抛出" 排除掉运行时的错误(除以 0,空指针之类的) java 抛错误也都是要你手动 throw 一个异常的,没理解你说的出错自动抛出的意思
AndyAO
2020-12-31 21:09:28 +08:00
不太懂 GO.

如果是我,会先了解 GO 这样设计的原因,一般而言,在比较好的书中应该都有讲述.看来你是个比较着急的人,没有仔细了解设计就开始用这门语言了,和我的做法不太相同.

不过,很多人其实对 Java 常常抛异常这件事情本身就是感到很厌恶的.

> Exception handling is one of the worst sources of complexity in software systems. Code that deals with special conditions is inherently harder to write than code that deals with normal cases, and developers often define exceptions without considering how they will be handled.
> From:*‪Philosophy_of_Software_Design*

盲猜 GO 这么做就是为了让你尽量远离抛异常.
TypeError
2020-12-31 21:16:07 +08:00
golang 开发团队提出过 try 的方案,被社区否决了

而且我觉得严重错误用 panic/recovery 、普通错误用返回值处理,也没啥不好的

go 的问题是简陋了点,要手写一堆 if err
如果像 rust 那样 Result + 模式匹配就优雅多了
SuperMild
2020-12-31 21:23:08 +08:00
go 这种方式也有好处,只是少了个语法糖,如果加一个 check err 语法糖,有错就立即返回错误,没错就继续执行,那就舒服多了。
geebos
2020-12-31 21:52:42 +08:00
@BeautifulSoap 我的意思是 Java 异常可以自动向外层函数抛出,而 Go 还要手动返回。假如是三层函数调用,Go 每一层都要手动返回,不然外层的函数就收不到错误。而 Java 就不需要,只要中间的函数没有 catch 错误会继续往外层函数传递。
Vedar
2020-12-31 22:18:20 +08:00
@geebos panic 不就是这样子么 不处理就整个 goroutine 崩掉
geebos
2020-12-31 22:57:41 +08:00
@Vedar 但是我不能捕获 panic 啊,这就是问题所在了
cheng6563
2020-12-31 23:01:59 +08:00
不要把 c 看成太高级的语言,把他看成 c 的优化版就行了
cheng6563
2020-12-31 23:02:25 +08:00
不要把 go 看成太高级的语言,把他看成 c 的优化版就行了

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

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

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

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

© 2021 V2EX