11.x
This commit is contained in:
15
11.1.md
15
11.1.md
@@ -18,7 +18,7 @@ error类型是一个接口类型,这是它的定义:
|
|||||||
Error() string
|
Error() string
|
||||||
}
|
}
|
||||||
|
|
||||||
error是一个内置的类型变量,我们可以在/builtin/包下面找到相应的定义。而我们在很多内部包里面用到的 error是errors包下面的实现的私有结构errorString
|
error是一个内置的接口类型,我们可以在/builtin/包下面找到相应的定义。而我们在很多内部包里面用到的 error是errors包下面的实现的私有结构errorString
|
||||||
|
|
||||||
// errorString is a trivial implementation of error.
|
// errorString is a trivial implementation of error.
|
||||||
type errorString struct {
|
type errorString struct {
|
||||||
@@ -28,6 +28,7 @@ error是一个内置的类型变量,我们可以在/builtin/包下面找到相
|
|||||||
func (e *errorString) Error() string {
|
func (e *errorString) Error() string {
|
||||||
return e.s
|
return e.s
|
||||||
}
|
}
|
||||||
|
|
||||||
你可以通过`errors.New`把一个字符串转化为errorString,以得到一个满足接口error的对象,其内部实现如下:
|
你可以通过`errors.New`把一个字符串转化为errorString,以得到一个满足接口error的对象,其内部实现如下:
|
||||||
|
|
||||||
// New returns an error that formats as the given text.
|
// New returns an error that formats as the given text.
|
||||||
@@ -71,6 +72,18 @@ Offset字段在调用Error的时候不会被打印,但是我们可以通过类
|
|||||||
return err
|
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包采用的方法:
|
上面例子简单的演示了如何自定义Error类型。但是如果我们还需要更复杂的错误处理呢?此时,我们来参考一下net包采用的方法:
|
||||||
|
|
||||||
package net
|
package net
|
||||||
|
|||||||
Reference in New Issue
Block a user