5.1 错误处理

go语言没有异常处理,一般通过返回值处理错误。例如strconv.Atoi函数将一个字符串转换成一个整数:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "strconv"
  6. )
  7. func main() {
  8. if len(os.Args) != 2 {
  9. os.Exit(1)
  10. }
  11. n, err := strconv.Atoi(os.Args[1])
  12. if err != nil {
  13. fmt.Println("not a valid number")
  14. } else {
  15. fmt.Println(n)
  16. }
  17. }

你也可以自己创建一个错误类型;唯一的要求就是它必须实现内置类型error接口:

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

通常情况下,我们可以通过导入errors包,然后使用包中的New函数创建一个自己的错误类型:

  1. import (
  2. "errors"
  3. )
  4. func process(count int) error {
  5. if count < 1 {
  6. return errors.New("Invalid count")
  7. }
  8. ...
  9. return nil
  10. }

go的标准库就是通过这种模式使用错误类型变量。例如,在io包中,有一个EOF变量定义如下:

  1. var EOF = errors.New("EOF")

这是一个包级别变量(它是定义在函数外面),该变量是可以访问的(因为第一个字母是大写字母)。当我们从文件或者标准输入中读取数据时,很多函数都能返回这种错误。如果有上下文关系,你也应该使用这个错误。作为消费者,我们可以使用这个单例:

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. )
  6. func main() {
  7. var input int
  8. _, err := fmt.Scan(&input)
  9. if err == io.EOF {
  10. fmt.Println("no more input!")
  11. }
  12. }

最后要指出的是,go语言有panicrecover函数。panic类似抛出异常,而recover类似捕获异常;但是很少使用它们。

链接