原创文章。转载请注明出处:server非业余研究-sunface

近期看谷歌go group里面有非常多讨论go error处理风格的问题,颇有启示。如今跟大家分享一下。首先请看一个提问:

Hi folks,

When I look at a lot of go code, I see the following pattern:
//当我看了很多go代码后,我发现了下面模式
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/ z
return nil
This is cool, but comes off as a bit verbose. I've been using the following as a replacement, which I think is a bit nicer:
//上段代码非常cool,可是表现的有点冗余。我已经用下面一种error机制作为替代。我觉得我的更好
var (
x, y, z T
err      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 

//出于好奇。请问有人用过我这样的风格然后有发现过缺点吗?或者这样的风格并不好?尽管我觉得非常好

Just curious, has anyone else used this sort of thing and found a pitfall? Or perhaps has an opinion as to why it isn't actually nice?

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处理风格的一些讨论和个人观点(上)相关推荐

  1. R语言问题解决:Error: Discrete value supplied to continuous scale

    R语言问题解决:Error: Discrete value supplied to continuous scale #仿真数据 set.seed(123) my_df1 <- data.fra ...

  2. 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 ...

  3. Serverless 风格微服务的持续交付(上):架构案例

    GitChat 作者:顾宇 原文:Serverless 风格微服务的持续交付(上):架构案例 关注微信公众号:GitChat 技术杂谈 ,一本正经的讲技术 [不要错过文末彩蛋] 无服务器架构 (Ser ...

  4. R语言ggplot2可视化:自定义函数在箱图(boxplot)上添加分组样本个数(count)、分组均值(mean)、箱体填充色自定义、数据标签色彩自定义

    R语言ggplot2可视化:自定义函数在箱图(boxplot)上添加分组样本个数(count).分组均值(mean).箱体填充色自定义.数据标签色彩自定义 目录

  5. R语言ggplot2可视化在分面图(facet_grid)的条形图上添加计数(count)或者百分比(percent)标签实战

    R语言ggplot2可视化在分面图(facet_grid)的条形图上添加计数(count)或者百分比(percent)标签实战 目录

  6. C语言如何编辑资源文件,用C语言做个简单的计算机,上面是代码,请教上资源文件在哪里编写,要新建什么文件...

    当前位置:我的异常网» C语言 » 用C语言做个简单的计算机,上面是代码,请教上资源 用C语言做个简单的计算机,上面是代码,请教上资源文件在哪里编写,要新建什么文件 www.myexceptions. ...

  7. Go语言实践[回顾]教程06--通过时间判断时辰的示例【上】

    Go语言实践[回顾]教程06--通过时间判断时辰的示例[上] 示例项目的需求 实现示例需求的源代码 使用 if 判断逻辑实现的源代码 使用 if else if 判断逻辑实现的源代码 使用 switc ...

  8. GO_10:GO语言基础之error

    Go错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型,这是它的定义: type error interface {Error() string } 我 ...

  9. c语言报错 error:1d returned 1 exit status 。(原因:把main写成了mian)

    没想到四年后的今天我竟然在重学c语言.唉,一把悲伤泪啊. 言归正传,今天照着书敲代码. 可是一点运行,就一直报错:error:1d returned 1 exit status. 找遍了网上的解决办法 ...

  10. 风格的要素 C语言 pdf,英语写作手册:风格的要素(新译本) [Elements of Style]

    产品特色 编辑推荐 <英语写作手册:风格的要素(新译本)>可以教你:英语写作中那些你不知道的坑.哪些单词和词组其实常被误用.哪些常见表达其实是重复啰嗦-- 内容简介 <英语写作手册: ...

最新文章

  1. python的直接赋值不会拷贝,只相当于变量的一个别名
  2. .NET福利集锦【持续整理中】
  3. C语言求一棵二叉树所有根到叶的路径(附完整源码)
  4. python元组和列表都支持的方法是_Python进阶1-元组和列表
  5. 虚拟主机-多域名多目录使用方法
  6. SpringBoot整合Kotlin构建Web服务
  7. atitit.数据验证--db数据库数据验证约束
  8. JAAS Authorization文档
  9. linux sqlplus 历史命令,SQLPLUS下历史命令查找
  10. cad计算机绘图实操视频,CAD电脑绘图教程视频
  11. 微信公众号上传图文素材thumb_media_id的获得
  12. ckplayer 一个不错的网页视频播放器
  13. 应用层——HTTP协议
  14. 内农大《嵌入式基础》实验一 Shell编程
  15. 国密SSL证书保障网站安全
  16. Nokia s60v5 j2me禁用softkeypad
  17. IoT 物联网碎片化是云厂商的桎梏,中小企业的机会
  18. v2视频服务器退出系统怎么启动,v2视频会议系统操作手册.doc
  19. 基于HCL的xx大学校园网设计与配置
  20. 惠普M329打印机更换副厂硒鼓后提示墨粉不足并无法打印

热门文章

  1. 云计算数据与信息安全防护
  2. 程序员必杀技——《编程全能词典》即将震憾上市
  3. 简易JTAG烧写程序的执行逻辑和流程
  4. 「10」民主投票法——KNN的秘密
  5. python复杂网络库networkx:基础
  6. python类:面向对象、继承、slot、多重继承
  7. python字符串转换为数字_Python不使用int()函数把字符串转换为数字的方法
  8. shell脚本编程学习(一)
  9. Usb设备驱动5:usb-firmware简易框架
  10. 分享一个免杀的netcat.exe