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/ z
return 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中。其它的都在外部处理
这里仅仅是一个简单的抛砖引玉。希望大家能发表下寻常项目中使用的错误处理机制,一起讨论。
Go语言 关于go error处理风格的一些讨论和个人观点(上)的更多相关文章
- [转载]VS2012编译C语言scanf函数error的解决方法
在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...
- kotlin 语言入门指南(二)--代码风格
语言风格 这里整理了 kotlin 惯用的代码风格,如果你有喜爱的代码风格,可以在 github 上给 kotlin 提 pull request . 创建DTOs(POJSs/POCOs) 文件: ...
- GO_10:GO语言基础之error
Go错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型,这是它的定义: type error interface { Error() string } ...
- GO语言基础之error
Go错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型,这是它的定义: type error interface { Error() string } ...
- R语言保存文件 Error in save error writing to connection
Error in save(filtered, file = paste(sampleName, "filtered", sep = "_")) : err ...
- C语言学习笔记--#error 、 #line 和 #pragma 的使用
1. #error 的用法 (1)#error 是一种预编译器指示字,用于生成一个编译错误消息 (2)用法:#error message //注意:message 不需要用双引号包围 (3)#erro ...
- R语言学习笔记-Error in ts(x):对象不是矩阵问题解决
1.问题 在对时间序列进行拟合操作时,发生:Error in ts(x):对象不是矩阵的错误,而直接在arima()函数中使用时没有问题的. > sample<-c2 > sampl ...
- Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目
Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...
- 对《神奇的C语言》文中例子 5 代码的分析讨论
在春节前,我曾经参与在<神奇的C语言>一文中的例子(5)的讨论,但限于评论内容的有限,现在本文再次对这个问题单独讨论.(此问题原貌,详见<神奇的C语言>,这里我将原文中的代码稍 ...
随机推荐
- 【SQL】行转列过滤,使用别名和不使用别名的区别用法。
需求为: 仿太平洋网站筛选. 多选类型的字段应采用‘并且’:单选和录入类型的字段应采用‘或者’ 比如有如下选项: 参数头 参数体 操作系统(多选) win7 win8 运行内存(单选) 2G 4G 商 ...
- Python 2.7 学习笔记 异常处理
如同别的开发语言,python也支持异常处理机制.本文介绍下它的基本语法. 一.异常的基本处理框架如下: try: 业务代码 except 异常类1: 异常处理代码 except 异常类2: 异常处理 ...
- Android有效解决加载大图片时内存溢出的问题
首先,您需要了解一下,图片占用内存的计算方法,传送门:http://blog.csdn.net/scry5566/article/details/11568751 尽量不要使用setImageBitm ...
- libgdx, mouse 关节
鼠标与body的交互就靠这个mouse 关节了. 在使用中:主要分成3步: 步1:mouseDown : 这个时期,调用world->QueryAABB.它有一个回调接口,并依据鼠标指针指定一个 ...
- svn:怎样批量删除.svn文件
怎样批量删除.svn文件 使用SVN工具的时候会生成一些以“svn”作为后缀的文件,而且每个文件夹下都有,如果想删除这些.svn文件夹,通过手动删除的渠道是很繁琐的事情. 通过以下的简单步骤可以在右键 ...
- stack around the variable “ ” was corrupted
用scanf格式控制不当经常发生此错误. 如 short int a=10; scanf("%d",&a); 应该是%hd; 一般是越界引起的. 参看:http://bl ...
- Git命令非主流札记
使用git做开发的版本管理也有一年半之多了,但是始终都是常用的branch commit status diff push等一些再常用不过的命令,最近闲下来,打算学习一下高端用法,所以就静下心来好好读 ...
- Surface,送我都不要
本文作于前几天,由于今天的突发新闻,已作了修订. Nokia的着火史 自从Elop那篇着火的平台备忘录出炉,Nokia的杯具就已经造成,唯一令人不解的就是:Elop为什么还没有被开除? 距离这个备忘录 ...
- 面试题之——抽象类(abstract class)与接口(interface)的区别
抽象类可以有构造方法,接口中不能有构造方法.(虽然抽象类有构造方法,但它也不能被实例化) 抽象类中可以有普通成员变量,接口中没有普通成员变量. 抽象类和接口中都可以包含静态成员变量.抽象类中的静态成员 ...
- JIRA初步
JIRA 是澳大利亚 Atlassian 公司开发的一款优秀的问题跟踪管理软件工具.可以对各种类型的问题进行跟踪管理.包含缺陷.任务.需求.改进等.JIRA採用J2EE技术.可以跨平台部署.它正被广泛 ...