这章中,我们将讨论 Go 功能杂记,放在其他地方都不太合适。

错误处理

Go 首选错误处理方式是返回值,而不是异常。考虑 strconv.Atoi 函数,它将接受一个字符串然后将它转换为一个整数。

package main

import (
  "fmt"
  "os"
  "strconv"
)

func main() {
  if len(os.Args) != 2 {
    os.Exit(1)
  }

  n, err := strconv.Atoi(os.Args[1])
  if err != nil {
    fmt.Println("not a valid number")
  } else {
    fmt.Println(n)
  }
}

你可以创建你自己的错误类型。唯一的要求是你必须实现内建 error 接口的契约:

type error interface {
  Error() string
}

更一般地,我们可以通过导入 errors 包然后使用它的 New 函数创建我们自己的错误:

import (
  "errors"
)


func process(count int) error {
  if count < 1 {
    return errors.New("Invalid count")
  }
  ...
  return nil
}

Go 标准库中有一个使用 error 变量的通用模式。例如, io 包中有一个 EOF 变量它是这样定义的:

var EOF = errors.New("EOF")

这是一个包级别的变量(被定义在函数之外),可以被其他包访问(首字母大写)。各种函数可以返回这个错误,例如,当我们从一个文件或者 STDIN 读取时。如果它具有上下文意义,那么您应该使用此错误。作为调用者,我们可以这样使用:

package main

import (
  "fmt"
  "io"
)

func main() {
  var input int
  _, err := fmt.Scan(&input)
  if err == io.EOF {
    fmt.Println("no more input!")
  }
}

作为最后一点,Go 确实有 panicrecover 函数。 panic 就像抛出异常,而 recover 就像 catch,它们很少使用。

热门教程

最新教程