golang通过内置的错误接口提供了非常简单的错误处理机制
error类型是一个接口类型,它的定义
type error interface {Error() string}
可以在编码中通过实现error接口类型来生成错误信息
函数通常在最后的返回值中返回错误信息。使用errors.New可返回一个错误信息
func Sqrt(f float64)(float64, error) {if f<0 {return 0, errors.New("math: square root of negative number")}// 实现}
在下面的例子中,调用Sqrt时传递了一个负数,就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输出错误
result, err := Sqrt(-1)if err != nil {fmt.Println(err)}
实例
package mainimport "fmt"// 实现一个DividerError结构type DivideError struct {dividee intdivider int}// 实现error接口func (de *DivideError) Error() string {strFormat := `Cannot proceed, the divider is zero,dividee: %ddivider: 0`return fmt.Sprintf(strFormat, de.dividee)}// 定义int类型除法运算的函数func Divide(varDividee int, varDivider int) (result int, errorMsg string) {if varDivider == 0 {dData := DivideError{dividee: varDividee,divider: varDivider,}errorMsg = dData.Error()return} else {return varDividee/varDivider, ""}}func main() {// 正常情况if result, errorMsg := Divide(100, 10); errorMsg == "" {fmt.Println("100/10 = ", result)}// 当除数为零的时候返回错误信息if _, errorMsg := Divide(100, 0); errorMsg != "" {fmt.Println("errorMsg is:", errorMsg)}}
