目录

  • ​​1、Golang error包​​
  • ​​2、创建 error​​
  • ​​3、错误处理​​
  • ​​3.1、抛出错误和处理错误​​
  • ​​3.2、errors.Is​​
  • ​​3.3、errors.As​​

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 语言的错误处理​