在C中,出错信息一般通过errno来处理,一般有两种方式,一种是用标准的errno全局变量, 另一种是自己定义错误码,然后在出错时返回错误码。但这里就涉及到一个线程安全的问题。 那在Golang中是如何处理的呢?
Golang 和Python一样支持多值返回。和C一样,Golang也可以通过返回错误码来返回错误。 同时Golang也支持CPP等OO里面的异常抛出错误。
Golang和Python一样支持多值返回,类似:
func swap(a,b int) (int,int)P{ return b,a } a,b = swap(a,b)
就可以实现两个值得交换。因此我们可以利用该特性在函数返回时多返回一个值表示其错误码。如 io.WriteString,向byte数组中写入字符串,若写入成功,返回的第二个参数err为nil,此时返回的 第一个参数为写入的字符数,若写入失败,则第二个返回值表示出错的出错码。因此检验时写成:
n,err := io.WriteString(yourWriterObject,"test") if err != nil { // deal with error condition }
在C中,我们返回了错误码的同时,可能还要调用strerror类似的函数来获得该错误码表示的意义,在Golang 中,通过使用error内建类型,我们可以把错误码和其对应的消息封装到一起。
在Golang中所有的错误用error这样的一个类型来表示。其定义为:
type error interface { Error() string }
是一个定义了Error()的接口。 那我们如何使用error呢?一般有两种方式。一种是借助errors模块直接得到一个 带有错误消息(可以调用Error方法返回错误信息)的error对象。另一种方式是自己实现一个error类型,并 实现其Error方法。
按照上面的讨论,我们定义一个类型: type MyError struct{ errno int msg string } func (e *MyError)Error() string{ return e.msg }
这样在使用的时候,我们如下使用即可:
return MyError{-4,"-4 means some error"}
这样返回一个error对象。通过调用该对象的Error方法即可知道出错信息。
在C中我们用一个数字的错误码主要是用来作区别使用,但是在Golang中,我们发现其实结构类型的本身就可以作 为区分。因此标准库提供了一个errors模块,用于用户自定义错误码。
通过errors模块的New方法得到一个含有错误消息的error对象,其定义为:
type errorString struct { s string }
使用方法:
return errors.New("A error occoure")
会为该对象的s赋值“A error occoure”,在调用Error是就会返回该字符串消息。
在我们自己使用的时候,可能会将错误进行统一定义。放到一个统一的文件中,如errno.go。
import errors EXXXSVR_LOAD_URL = errors.New("[XXXSVR]:Load url error")
在使用的时候,直接return
import yourpath.errno return errno.EXXXSVR_LOAD_URL
本文出自 “Done_in_72_hours” 博客,请务必保留此出处http://gotaly.blog.51cto.com/8861157/1410037
原文:http://gotaly.blog.51cto.com/8861157/1410037