问下go的错误处理风格选择

2013-08-21 17:26:25 +08:00
 sillyousu
if data, err := GetData(); err != nil {
//handle error
} else {
//bz job
}

还是
if data, err := GetData(); err == nil {
//bz job
} else {
//handler error
}

我倾向与把错误处理卸载前面,应为错误现在的错误处理都比较短。

问:
1. 哪种是普适好选择(如果有的话)?为什么?
2. 还是应该根据情景选择,考虑哪些因素?
2551 次点击
所在节点    Go 编程语言
14 条回复
suchj
2013-08-21 17:37:12 +08:00
我个人是这样做的,大部分函数都会带错误返回,因此:

if data, err := GetData(); err != nil {
//handle error
return
}

假如不需要错误返回,仅需错误处理,也是上面这种方式,没必要带一个 else,接着写正常的处理流程就行了,这样可以减少代码的嵌套层数,使代码更加清晰:

if data, err := GetData(); err != nil {
//handle error
}
//blabla...

具体可以参考 Go 编程语言的 12 条最佳实践:
http://www.oschina.net/news/42825/go-best-practices?from=20130804
reusFork
2013-08-21 17:42:58 +08:00
用第一种就不需要else了
chisj
2013-08-21 18:01:29 +08:00
异常处理一般都是写前面的,什么语言都一样。
rwx
2013-08-21 18:10:55 +08:00
先判断错误尽早返回
另外像
if data, err := GetData(); err != nil {
//handle error
return
}
这种形式data的作用域只是在if内部吧,后续完全没法利用到了
除非需要判断err,否则我一般写成
data, err := GetData()
if err != nil {
//handle error
return
}
dosomething(data)
rwx
2013-08-21 18:11:51 +08:00
#4 「除非需要判断err」->「除非只需要判断err」
sillyousu
2013-08-21 18:24:17 +08:00
@reusFork
这是公司的一个内部系统的代码。
现在的代码对某些错误只做了log,没有返回 囧

其实我比较喜欢
data, err := GetData()
if err != nill {
//handle err & return
}
//bz job
这样写的。
janxin
2013-08-21 18:54:22 +08:00
data, err := GetData()
if err != nill {
//handle err & return
}

目前基本是这种方式,很多时候需要注意return,还好go里不用考虑释放什么的问题,否则弄不好就泄漏了

if err == nill {
....
}else{
//handle err & return
}
很多时候做容错情况下用,就是有些情况这样用比较好
RisingV
2013-08-22 09:30:24 +08:00
因为错误不是在所有地方都能进行处理的,等返回到可以处理的地方,你可能已经不知道错误是哪个地方来的。
这是go的末尾返回error的弊端所在,try/catch方式就能记录完整的调用栈。但是go的这种简洁的方式,很多时候也够用了。
作为弥补,可以自己写一套简单的库,在error返回时,封装更多的调用信息进去。这样排错的时候,可以节省很多功夫。
fanweixiao
2013-09-03 16:27:31 +08:00
同意1楼意见。去掉嵌套后代码逻辑清晰直观,在panic起来也会方便很多,更适合使用goroutine去pipe各种业务了。有时候在 err != nil 的时候可能要写更多的业务。
meta
2013-09-07 12:59:56 +08:00
if...else里面不能同时有return,所以最好不要写else。
Syndim
2013-09-07 14:25:49 +08:00
@meta Go 1.1 可以了
bombless
2013-09-07 17:13:16 +08:00
就算try-catch可以找回抛出错误的调用栈,但同一个函数里你怎么知道返回的错误都是类似的?你还是要就地处理错误然后抛出另一个异常。就这一点来说go的风格也是类似的。

再说了,一般人处理的时候根本不会去看是哪个栈抛出的错误。
bombless
2013-09-07 17:13:55 +08:00
我是说八楼的
meta
2013-09-07 18:40:32 +08:00
@Syndim 是吗,感谢提醒,我都没太注意现在是1.1了。

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

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

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

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

© 2021 V2EX