golang错误处理之errorgolang中没有try/catch这样的异常处理机制,只能依靠返回值来做状态是否出错判断(当然它有个panic/recover机制,但一般只处理意想不到的错误)。
对于函数的返回值,惯例是最后一个参数返回error对象,来表示函数运行的状态。
如:
n, err := func()if err != nil { ...//process error}或者写在一起
if n, err := func(); err != nil { ...//process error}
error对象可以由errors.new()或fmt.errorf()构造。
如:
var dividederr = errors.new(cant divided by 0)或
err := fmt.errorf(%d cant divided by 0, arg)
我们先来看看error到底是什么类型。
error在标准库中被定义为一个接口类型,该接口只有一个error()方法:
type error interface { error() string}也就是说,自定义的结构只需要拥有error()方法,就相当于实现了error接口。
我们可以创建一个结构体,并实现error()方法,就能根据自己的意愿构造error对象了。
如:
type division struct { arg int str string}func (e *division) error() string { return fmt.sprintf(%d %s, e.arg, e.str)}func dividecheck(arg1, arg2 int) (error) { if arg2 == 0 { return &division{arg1, can't divided by 0} } return nil}
再来看一个例子,检查一组数据中是否有不能除(即除数为0)的情况,如果有则返回出错。
代码如下:
package mainimport fmtfunc dividecheck(arg1, arg2 int) (error) { if arg2 == 0 { return fmt.errorf(%d can't divided by 0, arg1) } return nil}func main() { var err error err = dividecheck(4, 2) if err != nil { fmt.println(err) return } err = dividecheck(8, 0) if err != nil { fmt.println(err) return }}
我们实现了这个功能,但是这样的代码非常不优雅,每执行一次函数调用都至少要用3行来做错误处理。
下面来优化一下。我们需要实现的功能是,只要有一个数不能除,就返回出错。那么只需要把每次检查后的状态存储到内部状态变量里,在全部处理完成后再检查这个变量就行了。
代码如下:
package mainimport fmttype division struct { err error}func (this *division)dividecheck(arg1, arg2 int) { if this.err != nil { return } if arg2 == 0 { this.err = fmt.errorf(%d can't divided by 0, arg1) return }}func (this *division)err() error { return this.err}func main() { d := new(division) d.dividecheck(4, 2) d.dividecheck(8, 0) if d.err() != nil { fmt.println(d.err()) }}
这么做代码就优雅多了,并且在每次检查前都判断内部状态是否已经出错,出错就马上返回,几乎没有性能损失。
golang的错误处理是经常被诟病的地方,但如果懂得以go的方式编程,还是可以做的挺优雅的~
http://www.bkjia.com/phpjc/1114325.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1114325.htmltecharticlegolang错误处理之error golang中没有try/catch这样的异常处理机制,只能依靠返回值来做状态是否出错判断(当然它有个panic/recover机制,但一般只...