请教一下怎么优雅的处理 go 中的 err

2019-05-24 08:51:41 +08:00
 d0m2o08
go 中大部分短赋值都会有一个 xx, err :=
难道要每次都 if err != nil 么
大佬都是用什么方式处理的?

func checkErr(err error) {
if err != nil{
panic(err)
}
}

这样貌似也很低级啊
9878 次点击
所在节点    Go 编程语言
62 条回复
guonaihong
2019-05-24 08:56:12 +08:00
不用 hack 第三库只能这样,或者等 go2.0
Fule
2019-05-24 09:07:33 +08:00
很久以前研究 GO 的时候,仿佛还说这种 if err != nil 的方式是优点,参数类型放在后面也是优点 …… 我几乎相信了……
wangsongyan
2019-05-24 09:10:49 +08:00
反正我是写 if err != nil return 写吐了
lhx2008
2019-05-24 09:11:36 +08:00
这个是真的不方便,try catch finally 被 Go 搞成 err != nil, recover, defer
araraloren
2019-05-24 09:11:48 +08:00
多返回值的滥用。。
Muninn
2019-05-24 09:27:19 +08:00
在 vscode 里打 ife 然后自动补全……
因为 golang 里概率最大的是返回一个 struct 的指针加 err,所以自动补全的这个也是返回 nil,err
如果只有一个返回值 err,再按 tab 把 nil 删掉就好了。
其实也就看起来浪费行数,用起来还是不错的,各种地方都无脑返回,只在最高层统一处理就好了。

API 的话可以在框架集中处理,参考我这篇文章
https://zhuanlan.zhihu.com/p/26300634
dodo2012
2019-05-24 09:28:16 +08:00
if err != nil 是真的太啰嗦,
Qzier
2019-05-24 09:32:24 +08:00
这是所谓的“特性”,无解。
BCy66drFCvk1Ou87
2019-05-24 09:32:24 +08:00
关键是这种写法
````
if err:= xxx; err != nil {
//
}
````
刚开始写 go 的时候很不习惯,跟 for 神似……
BCy66drFCvk1Ou87
2019-05-24 09:33:09 +08:00
@HuasLeung err := xxx 空格打多了
freestyle
2019-05-24 09:36:39 +08:00
https://imhanjm.com/2018/07/08/go 代码如何优雅地错误处理(error%20handling%20and%20go%201)/
freestyle
2019-05-24 09:40:17 +08:00
pmispig
2019-05-24 09:43:16 +08:00
我现在已经接受了这种写法了,反过来想,C 不是也得判断返回值是否大于 0 吗
zvall
2019-05-24 09:44:59 +08:00
趁早放弃 go 吧
chenset
2019-05-24 09:49:29 +08:00
Live Templates 缓解一下
zzn
2019-05-24 09:54:26 +08:00
错误处理本来就是个大难题, 异常也不见得有好多多少

但是在 go 里面逢错误就 panic 的写法毫无疑问很低级
VDimos
2019-05-24 09:59:43 +08:00
和 rust 的 Result 有得一拼
Vegetable
2019-05-24 09:59:54 +08:00
这个让我想起了地铁的手指口呼.

https://zh.wikipedia.org/wiki/%E6%8C%87%E5%B7%AE%E7%A2%BA%E8%AA%8D

这样强迫 coder 显式处理每一个可能出现的错误,可以说是有好处的,可以说现在写输入 ife 已经成了肌肉记忆了 233333
chenset
2019-05-24 10:06:08 +08:00
看了下 Go 2 引入了 check & handle https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md#draft-design

```

func CopyFile(src, dst string) error {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}

r := check os.Open(src)
defer r.Close()

w := check os.Create(dst)
handle err {
w.Close()
os.Remove(dst) // (only if a check fails)
}

check io.Copy(w, r)
check w.Close()
return nil
}

```
cubecube
2019-05-24 10:10:19 +08:00
异常可以不处理,一直抛啊。

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

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

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

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

© 2021 V2EX