Go 新提案:用 #err 标识符去做错误处理!

开发 前端
在 Go 这门编程语言中,错误处理机制主要是依赖于 if err != nil 的方式。因此在对函数做一定的封装后。

大家好,我是煎鱼。

前几天看 Reddit 社区里的讨论,发现 Go 这一门编程语言,错误处理永远是讨论的议题之一。本着追踪网友脑洞 Proposal 的基础上,周末看到个被反对比较多的 Go2 错误处理提案。

图片图片

今天结合分享给大家,好的坏的都可以看看别人的想法。

问题背景

在 Go 这门编程语言中,错误处理机制主要是依赖于 if err != nil 的方式。因此在对函数做一定的封装后。

代码最终常呈现出以下样子:

jy1, err := GetFoo()
if err != nil {
    return err
}
jy2, err := SliceTheBar(varFoo)
if err != nil {
    return err
}
err := CheckBarSlice(sliceBar)
if err != nil {
    return err
}
...

有部分开发者会认为这比较的丑陋、混乱且难以阅读。

图片图片

有人戏称一个 Go 工程里有 60% 的代码是 if err != nil,为此我见过直接用 panic 来做错误处理的团队。

新提案:用 #err 作为标识符

提案的提出者 @mainjzb,主要的设计目标是:将 # 作为标识位,格式上是把 #xxx 作为程序处理错误的标识符。帮助开发者阅读代码并简化代码。

原本 Go 错误处理方式,如下老代码:

n, err := io.Write(x)
n, _ := io.Write(x) 

n, err := io.Write(x)
if err != nil {
   return 0, err
}

n, err := io.Write(x)
if err != nil {
   return 0, fmt.Error("tcp closed: %w", err)
}

n, err := io.Write(x)
if err != nil{
    panic(err)
}

使用上述提案后的错误标识改造后,新的代码如下:

// 1. err as value
n := io.Write(x) #err       

// 2. ignore error
n := io.Write(x) #@ignore   

//  3. return error immediately、
n := io.Write(x) #@done     

// 4. wrap additional information
n := io.Write(x) #@wrap("tcp closed: %w") 

// 5. panic err
n := io.Write(x) #@must

结合上述提案改进后的代码,原作者给出了以下几种 # 标识符的想法:

  1. #err 标识符:err 变量作为值,一切与以前 error 一样。只是变成了 #err 的标识用法。
  2. #@ignore 标识符:使忽略错误变得比以前更易读,也可以用附加的描述信息便于开发者阅读。
  3. #@done 标识符:直接返回错误信息。很多时候(特别是在库中),只需要返回错误,无需执行任何操作。例如:url.parseAuthority。
  4. #@wrap 标识符:在 error 上附带更多的错误信息,例如:#@wrap 在实际业务代码中可以写作 #@wrap("io.Wirite err:")。
  5. #@must 标识符:这个标识符可以在产生错误时,直接触发 panic 事件。

总结

这个提案的作者有多门编程语言经验,本次提出的新提案,很明显是瞄着解决 Go 这门编程语言中的 if err != nil 的不断重复的代码内容的方向去的。

虽然原提案作者另辟蹊径,通过增加 #err 这类标识符来直接扭转错误处理,解决了大量重复 err 代码。

图片图片

但最终与 Go 语言的其他部分过于不适。已经被 ban 了。谨记:想要优化 GO 的 if err != nil 还得要考虑整体适合度,不能一厢情愿。

责任编辑:武晓燕 来源: 脑子进煎鱼了
相关推荐

2023-03-10 08:48:29

2022-07-13 08:53:28

函数Go语言

2020-12-17 06:25:05

Gopanic 模式

2022-10-24 08:55:13

Go工具链开发者

2022-09-05 08:55:15

Go2提案语法

2022-12-12 08:53:53

Go版本方式

2024-11-19 09:10:19

迭代器Go语言

2014-11-17 10:05:12

Go语言

2021-04-29 09:02:44

语言Go 处理

2023-08-22 08:52:14

Go零值标识符

2009-09-23 10:41:10

对象标识符Hibernate

2024-02-28 08:54:57

switchGo错误

2012-02-08 14:01:18

HibernateJava

2009-08-26 14:01:18

C#标识符

2022-05-26 08:53:47

Go函数代码

2024-03-14 09:35:54

Go 错误select代码

2021-09-13 07:53:31

Go错误处理

2024-03-27 08:18:02

Spring映射HTML

2021-09-27 15:33:48

Go 开发技术

2023-10-26 15:49:53

Go日志
点赞
收藏

51CTO技术栈公众号