go标准库之errors模块

76 阅读1分钟

errors 包实现了操作错误函数,语言使用 error 类型来返回函数执行过程中遇到的错误,如果返回的 error 的值为 nil ,表示未遇到错误,否则 error 会返回一个字符串,用于说明遇到了什么错误

error结构

type error interface {
	Error() string
}

error 可以是任意类型,函数返回的 error 值实际可以包含任意信息,不一定是字符串

error 不一定表示一个错误,它可以表示任何信息,比如 io 包中就用 error 类型的 io.EOF 表示读取结束,而不是遇到了错误

errors 包实现了一个最简单的 error 类型,只包含一个字符串,它可以记录大多数情况下遇到的错误信息。 errors 包的用法也很简单,只有一个 New 函数,用于生成一个最简单的 error 对象

func New(text string) error
package main

import (
	"errors"
	"fmt"
)

func check(s string) (string, error) {
	if s == "" {
		err := errors.New("字符串不能为空")
		return "", err
	} else {
		return s, nil
	}
}

func main() {
	s, err := check("hello")
	if err != nil {
		fmt.Printf("err: %v\n", err)
	} else {
		fmt.Printf("s: %v\n", s)
	}
}

自定义错误

// 自定义错误的结构体
type MyError struct {
	When time.Time // 什么时候发生错误
	What string    // 什么错误
}

// 结构体实现Error接口
func (e MyError) Error() string {
	return fmt.Sprint("%v: %v", e.When, e.What)
}

func oops() error {
	return MyError{
		time.Date(1989, 3, 15, 22, 30, 0, 0, time.UTC),
		"the file system has gone away",
	}
}

func main() {
	err := oops()
	if err != nil {
		fmt.Println(err)
	}
}