Go语言 关于go error处理风格的一些讨论和个人观点(上)
原创文章。转载请注明出处:server非业余研究-sunface
近期看谷歌go group里面有非常多讨论go error处理风格的问题,颇有启示。如今跟大家分享一下。首先请看一个提问:
Hi folks,
x, err := foo()if err != nil {return err}y, err := bar(x)if err != nil {return err}z, err := baz(y)if err != nil {return err}// do something w/ zreturn nil
var (x, y, z Terr error)x, err = foo()if err == nil {y, err = bar(x)}if err == nil {z, err = baz(y)}
if err == nil {
// do something w/ z
}
return err
//出于好奇。请问有人用过我这样的风格然后有发现过缺点吗?或者这样的风格并不好?尽管我觉得非常好
I think it's nice =].
看了上面两种错误处理风格。大家应该已经看出了部分端倪:第一种是比較传统的error处理方式,另外一种是作者觉得比較创新的error处理方式。
先不说第一种的优缺点,
另外一种首先在开头设置了全部接收error的变量。然后后面的error处理方式是环环相扣,冗余度很之高。且直到最后才return,也就是说假设代码够长。那你得看完中间全部的处理过程。在这里你仅仅有读完了整段代码才知道foo()产生的错误究竟是怎么处理的。
然后一个评论中提出了一种个人认为不错的风格:
value,err := bar()
if err != nil {
goto handleError
}
.
.
.
.
handleError:
return err
在这样的风格中不须要去知道goto和label中间的代码。能够直接进行错误处理并返回,因此代码简洁、可读性强、性能高且冗余度低。
另一个评论提出了一种非常特别的风格:
if x, err := foo(); err != nil {
return err
} else if y, err := bar(x); err != nil {
return err
} else if z, err := baz(y); err != nil {
return err
} else {
// do something w/ x,y,z
return nil
}
这样的写法的代码比較简洁,return的地方一眼便可得知。
以下这样的风格能够节省大量的if语句
func checkErr( err error) {
if err != nil {
//deal error here
}
}
func main() {
ting,err := whatever()
checkErr(err)
}
以下再说说我个人对提问中第二段代码的看法,主要有3点:
1.在第二段代码中,全部的有意义的代码都是环环相扣,每个if和return都要记在脑袋里,详细能够看下这篇文章:代码的嵌套——各种状态的组合。在第一段代码中全部的错误处理都是在产生错误代码的以下,非常easy发现什么代码导致了某个错误。并且在那些if代码块之后。你不须要操心之前的x,y,z。由于它们都是合法的。可是在第二段代码中,永远不能知道x,y,z是否合法,每次都得继续验证前面的值。
2.由于第二段代码的错误处理和返回方式(环环相扣),我们就无法得知error的详细位置,唯一能做的就是彻底放弃然后无奈的说一句“代码有BUG了”,仅此而已。
3.每次你往第二段代码的函数添加新的代码的时候,都要放在一个if代码快中。相反在第一段代码中,就不须要,由于仅仅有错误处理在if中。其它的都在外部处理
这里仅仅是一个简单的抛砖引玉。希望大家能发表下寻常项目中使用的错误处理机制,一起讨论。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5152862.html,如需转载请自行联系原作者
Go语言 关于go error处理风格的一些讨论和个人观点(上)相关推荐
- R语言问题解决:Error: Discrete value supplied to continuous scale
R语言问题解决:Error: Discrete value supplied to continuous scale #仿真数据 set.seed(123) my_df1 <- data.fra ...
- stm32中c语言换行符error——expect a declaration warning——“\“followed by white space is not a line splic
标题 stm32中c语言换行符error--expect a declaration warning--""followed by white space is not a lin ...
- Serverless 风格微服务的持续交付(上):架构案例
GitChat 作者:顾宇 原文:Serverless 风格微服务的持续交付(上):架构案例 关注微信公众号:GitChat 技术杂谈 ,一本正经的讲技术 [不要错过文末彩蛋] 无服务器架构 (Ser ...
- R语言ggplot2可视化:自定义函数在箱图(boxplot)上添加分组样本个数(count)、分组均值(mean)、箱体填充色自定义、数据标签色彩自定义
R语言ggplot2可视化:自定义函数在箱图(boxplot)上添加分组样本个数(count).分组均值(mean).箱体填充色自定义.数据标签色彩自定义 目录
- R语言ggplot2可视化在分面图(facet_grid)的条形图上添加计数(count)或者百分比(percent)标签实战
R语言ggplot2可视化在分面图(facet_grid)的条形图上添加计数(count)或者百分比(percent)标签实战 目录
- C语言如何编辑资源文件,用C语言做个简单的计算机,上面是代码,请教上资源文件在哪里编写,要新建什么文件...
当前位置:我的异常网» C语言 » 用C语言做个简单的计算机,上面是代码,请教上资源 用C语言做个简单的计算机,上面是代码,请教上资源文件在哪里编写,要新建什么文件 www.myexceptions. ...
- Go语言实践[回顾]教程06--通过时间判断时辰的示例【上】
Go语言实践[回顾]教程06--通过时间判断时辰的示例[上] 示例项目的需求 实现示例需求的源代码 使用 if 判断逻辑实现的源代码 使用 if else if 判断逻辑实现的源代码 使用 switc ...
- GO_10:GO语言基础之error
Go错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型,这是它的定义: type error interface {Error() string } 我 ...
- c语言报错 error:1d returned 1 exit status 。(原因:把main写成了mian)
没想到四年后的今天我竟然在重学c语言.唉,一把悲伤泪啊. 言归正传,今天照着书敲代码. 可是一点运行,就一直报错:error:1d returned 1 exit status. 找遍了网上的解决办法 ...
- 风格的要素 C语言 pdf,英语写作手册:风格的要素(新译本) [Elements of Style]
产品特色 编辑推荐 <英语写作手册:风格的要素(新译本)>可以教你:英语写作中那些你不知道的坑.哪些单词和词组其实常被误用.哪些常见表达其实是重复啰嗦-- 内容简介 <英语写作手册: ...
最新文章
- python的直接赋值不会拷贝,只相当于变量的一个别名
- .NET福利集锦【持续整理中】
- C语言求一棵二叉树所有根到叶的路径(附完整源码)
- python元组和列表都支持的方法是_Python进阶1-元组和列表
- 虚拟主机-多域名多目录使用方法
- SpringBoot整合Kotlin构建Web服务
- atitit.数据验证--db数据库数据验证约束
- JAAS Authorization文档
- linux sqlplus 历史命令,SQLPLUS下历史命令查找
- cad计算机绘图实操视频,CAD电脑绘图教程视频
- 微信公众号上传图文素材thumb_media_id的获得
- ckplayer 一个不错的网页视频播放器
- 应用层——HTTP协议
- 内农大《嵌入式基础》实验一 Shell编程
- 国密SSL证书保障网站安全
- Nokia s60v5 j2me禁用softkeypad
- IoT 物联网碎片化是云厂商的桎梏,中小企业的机会
- v2视频服务器退出系统怎么启动,v2视频会议系统操作手册.doc
- 基于HCL的xx大学校园网设计与配置
- 惠普M329打印机更换副厂硒鼓后提示墨粉不足并无法打印