Files
build-web-application-with-…/11.1.md
2012-11-01 16:10:44 +08:00

2.2 KiB
Raw Blame History

11.1 错误处理

Go语言设计的时候主要的特点是简洁、明白简洁是指语法和C类似相当的简单明白是指任何语句都是很明显的不含有任何隐式的东西Go在设计错误的时候也是一样。我们知道C语言里面返回错误是使用-1或者nil之类的返回信息表示错误但是对于使用者来说这个返回值根本不知道什么意思而Go里面当发生异常时返回一个Error类型通过前面编写的代码我们发现在Go语言里面有很多地方都使用了Error类型很多函数都有这个Error返回。例如os.Open函数当打开文件失败时返回一个不为nil的error

func Open(name string) (file *File, err error)

下面这个例子通过os.Open打开一个文件,如果出错那么会执行log.Fatal打印出来错误信息:

f, err := os.Open("filename.ext")
if err != nil {
	log.Fatal(err)
}

其实这样的error返回在Go语言的很多内置包里面有很多我们这个小节将详细的介绍这些error是怎么设计的以及在我们设计的Web应用如何更好的处理error。

Error类型

error类型是一个接口类型这是它的定义

type error interface {
	Error() string
}

error是一个内置的类型变量我们可以在/builtin/包下面找到相应的定义。而我们在很多内部包里面用到的 error是errors包下面的实现的非导出结构errorString

// errorString is a trivial implementation of error.
type errorString struct {
	s string
}

func (e *errorString) Error() string {
	return e.s
}

你可以通过errors.New把一个字符串转化为errorString然后返回error接口其内部实现如下

// New returns an error that formats as the given text.
func New(text string) error {
	return &errorString{text}
}

下面这个例子演示了如何使用errors.New:

func Sqrt(f float64) (float64, error) {
if f < 0 {
	return 0, errors.New("math: square root of negative number")
}
// implementation
}

自定义Error

Error检测

总结