首页 > 代码库 > Golang的errno

Golang的errno

在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