Golang Go语言中的错误处理真的很糟糕

发布于 1周前 作者 yuanlaile 来自 Go语言

一直用 golang ,一直有人吐槽 golang 错误处理很繁琐,一开始觉得还好,直到遇见了 rust 。不得不说 rust 错误处理真的很优雅。写了一段时间 rust 反过来写 golang ,繁琐感瞬间就出来了


Golang Go语言中的错误处理真的很糟糕
34 回复

确实,看过 rust 就觉得 go 的 err 有点…

更多关于Golang Go语言中的错误处理真的很糟糕的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我见过吐槽 go 的 err 的,下都都会用 java 来反驳,来证明 go 的 err 是最优雅的

Box<dyn Error> 一把梭是吧

其实 go 里你是能实现 rust 风格的 error 处理的,pattern matching 不好整,.unwrap 啥的你可以 replace error 搞

https://github.com/morrisxyang/errors, 这里实现了 wrap, unwrap 等常见能力, 添加了错误码和堆栈的支持.
rust 的 pattern matching 可以给我一些 example 和资料吗? 我看看是否可以添加.

现在 go 错误处理比刚出来的时候好多了,繁琐是有点,但是没啥心智负担(对写应用来说),只是和 rust 比起来显得有点草率,基本和 rust 无脑 anyhow::Error 一样

if err != nil

感觉,rust>go>其他绝大部分 try-catch

大道至简 警告[滑稽]

接触 go 之前一直写 c ,go 这种错误处理方式倒觉得挺适应的

try-catch 比 go 的 error 更恶心

try-catch 多被用于异常处理,控制流来说是快速返回调用栈的作用(stack unwinding),C 里也有类似的 setjmp,longjmp 机制。
而 go 里 error 是多返回值,绝大多数语言其实也都可以实现类似的方案。

同意 java 到处充斥这个 try catch 一层套一层

golang 的很糟糕,rust 比 golang 好在哪里?

我们 go 语言错误处理就是这样子的 (#^.^#)

golang 官方解释说:异常也被认为是一种返回值类型

Java 的 try catch 不是能在最外层统一处理吗?我感觉这样挺省事的啊,反而是 go 每一层都要 if err != nil 感觉很啰唆

月经贴了属于是

个人觉得 java 的报错摆烂处理方便些; golang 精确处理方便些

rust 怎么都方便

意思是直接 panic 抛出然后拿个 defer recover 统一处理?

rust 主要是有个 Result 枚举类型,以及语法糖’?’,再加上一些 map_err unwrap_or 函数之类的,go 能做吗?

确实,相比 try-catch ,go 的错误处理相对好很多了,但比 rust 还是差一些




很多语言都是 try catch 那套吧? Java 主要是检查性异常必须捕获就很恶心了,但是现在也可以用 lombok 插件加个

go 的 if err != nil {} 比 java 的 try catch 难用多了… 这玩意儿每个地方都要强制 if err!=nil {}一波

rust 的还可以. 毕竟可以? 直接往外面传播. 可以在最外层统一处理.

用习惯了,没感觉,配合 Copilot 就一个 tab 的事情

是繁琐 但是 try-catch 怎么判断 到底错误在什么地方出现呢?难道随时打开堆栈信息吗?

写 C 的表示没啥

Do you guys not write c??

不是啊 你就当异常是一个返回值。比如方法需要返回 int ,但方法里面处理可能会异常,那么你就在该方法加一个返回值变成 func method() (int, error)

?出来的问题我记得是 panic ,在外层统一处理就和 try-catch 无异了,失去了 Result 的灵魂

rust ? 是直接返回啊. Err 往上层传播

再灵魂也不能每个地方都去 match res {
ok -> xxx,
err -> xxx
}

无感,基本还没写过 try catch 的语言,go 的这种就感觉挺符合直觉的,当然觉得应该还有改善空间。。

我觉得, return error 和 try catch 的应用场景有差异, 各有优势, 语言应该同时提供这两种, 由程序员自己决定用哪种.

让我来看一下,如果是泛型的话 或许可以

关于Golang(Go语言)中的错误处理,其实这是一个在Go社区中经常被讨论的话题,但称其为“很糟糕”可能有些过于片面。

Go语言的错误处理机制确实有其独特之处,它采用了显式的错误返回值方式,即函数返回两个值,一个是期望的结果,另一个是可能发生的错误。这种方式使得错误处理变得非常明确和可追踪,开发者必须在调用函数时处理可能的错误,这有助于避免许多因未处理错误而导致的潜在问题。

当然,这种机制也有其不足之处。比如,在一些情况下,它可能会导致代码变得冗长,特别是当错误处理逻辑相对简单且重复时。此外,对于习惯了其他语言自动异常处理机制的开发者来说,可能需要一段时间来适应这种显式的错误处理方式。

然而,Go语言的错误处理也有其优势。它鼓励开发者对错误进行积极的处理,而不是简单地忽略它们。这种设计有助于构建更加健壮和可靠的系统。

总的来说,Go语言的错误处理机制并不是“很糟糕”,而是一种经过深思熟虑的设计选择。它有其优点和缺点,但关键在于如何根据具体情况合理地使用它。开发者可以通过编写辅助函数、使用更高级的错误处理模式(如错误包装和错误链)等方式来优化错误处理代码,从而提高代码的可读性和可维护性。

回到顶部