Go的错误处理是优雅的

谢权 · · 1550 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

英文原文链接:http://davidnix.io/post/error-handling-in-go/

Go的初学者经常批评Go的错误处理机制。请注意,我没有说异常处理。Go没有异常,虽然可以用panic and recover的模拟它和恢复。但我强烈建议反对。这是一个反模式,如果使用过于频繁。我记得上个月七牛的许式伟在上海GopherMeetup上也提到过这个问题。

Go允许多个返回值,按照惯例,如果事情会出错,函数返回一个错误,因为它的最后一个返回值

error type:

这意味着任何类型实现的方法称为Error()

返回一个字符串,实现了错误的接口。返回的字符串应该说明了什么问题。看看Go的interfaces,如果你感到困惑。

In a lot of sample Go code, you see:

A lot of programmers have beef with this seemingly constant nil checking:

看下Java的处理:

shiny new Swift 2:

看完了Java和swift再看看Go

Errors are Values:

(下面不知道怎么翻译比较好,等我想好了再翻译。)

The Go team purposefully chose errors to be values.

Values can be programmed, and since errors are values, errors can be programmed. Errors are not like exceptions. There’s nothing special about them, whereas an unhandled exception can crash your program.

 

In Go, functions pass errors around just like any other type. Because indeed they are just a type.

Exceptions, on the other hand, are unique. They can wreak havoc on your program if left unchecked. (I realize there are technical differences between Swift errors and exceptions. But the semantics are the same in regards to error handling.)

So, if we can handle errors using simple values, why do we need this special exception stuff? Why not leave that complexity out of the language?

I’m not sure if the Go authors reached that exact conclusion, but it make sense to me.

Flow of Control

Rob Pike also writes:

Error handling [in Go] does not obscure the flow of control.

Swift 的流程控制:

对于简单业务也许可以使用这个嵌套,但是,如果有更多像if / else的嵌套呢?代码就会难以阅读。

Swift 2引入了guard statement来提高流程控制。

然而你不能用guard 在swift中来检查错误。但是,如果你要来检查错误或者避免嵌套?你就不能这么做了。

然而看看Go是多么的简洁。

Code Your Way Out of It

Just because you can do this

As a simple example, when I write CLI tools in Go, I usually have a function:

总结:

我希望我能表达出了Go错误机制并不是大家想象的那么糟糕。至少我觉得是很优雅的。

Go的错误处理是优雅的

有疑问加站长微信联系(非本文作者)

本文来自:谢权SELF

感谢作者:谢权

查看原文:Go的错误处理是优雅的

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1550 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传