Go 语言通过内置的错误接口提供了非常简单的错误处理机制。

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. }

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

执行以上程序,输出结果为:

  1. 100/10 = 10
  2. errorMsg is:
  3. Cannot proceed, the divider is zero.
  4. dividee: 100
  5. divider: 0