(目录)
1、Golang error包
内建error接口
// builtin.go
type error interface {
    Error() string
}
实现error接口
// errors.go
package errors
type errorString struct {
    s string
}
func (e *errorString) Error() string {
    return e.s
}
2、创建 error
定义
// package errors
func New(text string) error {}
// package fmt
func Errorf(format string, a ...any) error {}
代码示例
package main
import (
    "errors"
    "fmt"
)
func main() {
    // 方式一:通过字符串构建 error
    err := errors.New("error")
    fmt.Printf("err: %v\n", err)
    // err: error
    // 方式二:格式化输出错误字符串
    fmtErr := fmt.Errorf("this is a error: %s", "fmt error")
    fmt.Printf("fmtErr: %v\n", fmtErr)
    // fmtErr: this is a error: fmt error
}
3、错误处理
3.1、抛出错误和处理错误
package main
import (
    "errors"
    "fmt"
)
// 自定义错误
var DBError = errors.New("DBError")
func getRecords() (any, error) {
    // 抛出错误
    return nil, DBError
}
func main() {
    // 错误处理
    _, err := getRecords()
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        fmt.Printf("not err")
    }
    // err: DBError
}
3.2、errors.Is
package main
import (
    "errors"
    "fmt"
)
// 自定义错误
var DBError = errors.New("DBError")
// 错误包裹
var NotFoundError = fmt.Errorf("%w", DBError)
func getRecords() (any, error) {
    return nil, NotFoundError
}
func main() {
    // 错误处理
    _, err := getRecords()
    if err != nil {
        if errors.Is(err, DBError) {
            fmt.Println("err Is DBError")
        }
        if errors.Is(err, NotFoundError) {
            fmt.Println("err Is NotFoundError")
        }
    } else {
        fmt.Printf("not err")
    }
    // err Is DBError
    // err Is NotFoundError
}
3.3、errors.As
package main
import (
    "errors"
    "fmt"
)
// 自定义错误
type DBError struct {
    desc string
}
func (dbError DBError) Error() string {
    return dbError.desc
}
func getRecords() (any, error) {
    return nil, DBError{
        desc: "DBError",
    }
}
func main() {
    // 错误处理
    _, err := getRecords()
    if err != nil {
        var dbError DBError
        if errors.Is(err, dbError) {
            fmt.Println("err Is DBError")
        }
        if errors.As(err, &dbError) {
            fmt.Println("err As NotFoundError")
        }
    } else {
        fmt.Printf("not err")
    }
    // err As NotFoundError
}
参考 Go 语言入门很简单:Go 语言的错误处理










