• 5.1 错误处理
    • 链接

    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类似捕获异常;但是很少使用它们。

    链接

    • 目录
    • 上一节:go花絮
    • 下一节:defer