Go 错误处理


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. // 实现
  6. }

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

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

实例

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

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

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