golang通过内置的错误接口提供了非常简单的错误处理机制
error类型是一个接口类型,它的定义

  1. type error interface {
  2. Error() string
  3. }

可以在编码中通过实现error接口类型来生成错误信息
函数通常在最后的返回值中返回错误信息。使用errors.New可返回一个错误信息

  1. func Sqrt(f float64)(float64, error) {
  2. if f<0 {
  3. return 0, errors.New("math: square root of negative number")
  4. }
  5. // 实现
  6. }

在下面的例子中,调用Sqrt时传递了一个负数,就得到了non-nil的error对象,将此对象与nil比较,结果为true,所以fmt.Println(fmt包在处理error时会调用Error方法)被调用,以输出错误

  1. result, err := Sqrt(-1)
  2. if err != nil {
  3. fmt.Println(err)
  4. }

实例

  1. package main
  2. import "fmt"
  3. // 实现一个DividerError结构
  4. type DivideError struct {
  5. dividee int
  6. divider int
  7. }
  8. // 实现error接口
  9. func (de *DivideError) Error() string {
  10. strFormat := `
  11. Cannot proceed, the divider is zero,
  12. dividee: %d
  13. divider: 0
  14. `
  15. return fmt.Sprintf(strFormat, de.dividee)
  16. }
  17. // 定义int类型除法运算的函数
  18. func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
  19. if varDivider == 0 {
  20. dData := DivideError{
  21. dividee: varDividee,
  22. divider: varDivider,
  23. }
  24. errorMsg = dData.Error()
  25. return
  26. } else {
  27. return varDividee/varDivider, ""
  28. }
  29. }
  30. func main() {
  31. // 正常情况
  32. if result, errorMsg := Divide(100, 10); errorMsg == "" {
  33. fmt.Println("100/10 = ", result)
  34. }
  35. // 当除数为零的时候返回错误信息
  36. if _, errorMsg := Divide(100, 0); errorMsg != "" {
  37. fmt.Println("errorMsg is:", errorMsg)
  38. }
  39. }