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

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

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

2804 次点击
所在节点    问与答
26 条回复
raaaaaar
2020-12-31 23:04:47 +08:00
不想作为返回值就 panic
BeautifulSoap
2020-12-31 23:21:12 +08:00
@geebos panic 能捕获啊,只不过函数内部无法像有异常机制的语言那样针对特定的代码段 try catch 罢了
。但你的需求是:程序出异常时顺着调用栈一路上抛然后集中处理。这点 panic 是完全可以胜任的

以及 go 语言使用 error 返回值也完全能实现将错误一路上抛的功能(只要你的程序对所有函数调用的 error 做处理就行,没你想得那么麻烦,ide 都是自动生成的)
学习一门语言就应该尝试遵循它的语言哲学,虽然 go 的这 error 返回值的确啰嗦了点,但是并不一定差于 try catch
我对 go 的 error 最大的不满也就是标准库里生成的 error 不带调用栈,导致错误一路返回到最顶层后完全不知道这错误的发生在哪里。不过这个问题解决起来也不难就是了
Bazingal
2021-01-01 10:03:39 +08:00
不懂 go,用返回值的方式返回错误,会自动带上堆栈吗
geebos
2021-01-02 13:10:00 +08:00
@BeautifulSoap 你说的很对,可能我以前用 Python 习惯了,突然转到 Go 有点受不了。但我觉的这也不能算作 Go 的哲学,反而更像设计时没有考虑到。不只是错误处理,还有变量声明的语法(使用 var 的时候不能进行初始化)、返回值设置了名字之后还需要手动 return 等等。至少在语法和错误处理方面我没看到 Go 的哲学。
BeautifulSoap
2021-01-02 13:20:11 +08:00
@geebos 带着偏见你永远看什么都是不行,编程语言本来就是多样性的,没有一个语言的语法必须怎样怎样的规定,你熟悉了一门语言很自然得会觉得所有语言都应该如此,但是这种思维作为程序员来说并不好
BeautifulSoap
2021-01-02 13:23:15 +08:00
@Bazingal 官方包里的不会带上堆栈,虽说用个第三方包,或者项目里自己给 error 加个堆栈就能解决,但是不是官方支持的确不好。这是目前用起来最不爽的地方

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

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

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

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

© 2021 V2EX