This commit is contained in:
hongruiqi
2013-01-29 15:53:58 +08:00
parent d17af589ca
commit ccfdf09cfb
2 changed files with 15 additions and 2 deletions

15
11.1.md
View File

@@ -18,7 +18,7 @@ error类型是一个接口类型这是它的定义
Error() string
}
error是一个内置的类型变量,我们可以在/builtin/包下面找到相应的定义。而我们在很多内部包里面用到的 error是errors包下面的实现的私有结构errorString
error是一个内置的接口类型,我们可以在/builtin/包下面找到相应的定义。而我们在很多内部包里面用到的 error是errors包下面的实现的私有结构errorString
// errorString is a trivial implementation of error.
type errorString struct {
@@ -28,6 +28,7 @@ error是一个内置的类型变量我们可以在/builtin/包下面找到相
func (e *errorString) Error() string {
return e.s
}
你可以通过`errors.New`把一个字符串转化为errorString以得到一个满足接口error的对象其内部实现如下
// New returns an error that formats as the given text.
@@ -71,6 +72,18 @@ Offset字段在调用Error的时候不会被打印但是我们可以通过类
return err
}
需要注意的是函数返回自定义错误时返回值也应设置为error类型而非自定义错误类型也不应预声明自定义错误类型的变量。例如
func Decode() *SyntaxError { // 错误将可能导致上层调用者err!=nil的判断永远为true。
var err *SyntaxError // 预声明错误变量
if 出错条件 {
err = &SyntaxError{}
}
return err // 错误虽然err变量等于nil但仍可能导致上层调用者err!=nil的判断为true
}
原因见 http://golang.org/doc/faq#nil_error
上面例子简单的演示了如何自定义Error类型。但是如果我们还需要更复杂的错误处理呢此时我们来参考一下net包采用的方法
package net

View File

@@ -246,4 +246,4 @@ GDB的一些常用命令如下所示
## links
* [目录](<preface.md>)
* 上一节: [错误处理](<11.1.md>)
* 下一节: [Go怎么写测试用例](<11.3.md>)
* 下一节: [Go怎么写测试用例](<11.3.md>)