探讨一下错误处理策略, 关于 if err != nil {

149 天前
 zzhirong

起因是看到 https://v2ex.com/t/1128449?p=1#reply41 写了

"相比之下 if err != nil 95%的时候都很不优雅"

好像我也看到很多吐槽 Go 错误处理语法的, 以下错误处理策略摘录自<<The Go Programming Language>> :

  1. Propagate the error. # 上抛
  2. Retry the failed operation. # 重试
  3. If progress is impossible, the caller can print the error and stop the program gracefully. # 严重错误, 退出程序
  4. It’s sufficient just to log the error and then continue, perhaps with reduced functionality. # 打印错误, 服务降级运行
  5. In rare cases we can safely ignore an error entirely. # 忽略错误

有无更优雅的方式能够实现上面的处理策略?

已知的两种:

  1. try except finally 除了实现 1 (上抛)优雅点, 剩下的也没看出多大优势,而且错误发生点和处理点不在同一处,这就注定需要额外的代码来重构上下文, 比如,打开 file1, 然后 file2, 但在打开第 file2 时发生错误,处理的时候得先判定是打开哪个文件出错了,再执行相应错误处理和回滚操作。
  2. 还有 Optional 一类的,和 if 没太大区别,只不过前者在语法上做了强制(不检查错误,不能拿到结果),还有一些语法糖( user?.address)。
2444 次点击
所在节点    Go 编程语言
25 条回复
ltaoo1o
149 天前
第一次接触到这种错误处理方案还是在 rust ,操作返回「结果」而不是「数据」,然后我就在 js 项目中引入了,配合 ts ,代码更健壮了

```js
const r = await dosomething();
if (r.error) {
return;
}
// <-- 如果没有上面 if r.errror ,直接获取 r.data 在编辑器里面就会给出提示,r.data 可能是空
console.log(r.data);
```
LawlietZ
149 天前
这个问题讨论了八九年了吧 ?
server
149 天前
各有各的优势,各有各的问题,习惯就好了
huigeer
149 天前
习惯就好,
zzhirong
149 天前
@LawlietZ 严格来说, 从 Go 正式发布开始就没停过吧, 后来伴随 Rust, TypeScript 等引入新的语法, 讨论又一次次开始, 我其实就是想看看这么多年过去了, 有无更优雅的方式出现。

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

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

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

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

© 2021 V2EX