Golang 标准库errors用法

Go语言的标准库中的errors包提供了一些用于创建和操作错误的基本功能。下面是对该包的详细用法说明。

基本用法

  1. 创建错误

    使用errors.New函数创建一个新的错误对象。errors.New接受一个字符串参数作为错误信息,并返回一个实现了error接口的对象。

    package main
    
    import (
        "errors"
        "fmt"
    )
    
    func main() {
        err := errors.New("这是一个错误")
        fmt.Println(err) // 输出: 这是一个错误
    }
    
  2. 使用fmt.Errorf格式化错误

    fmt包也提供了一个创建错误的方法——fmt.Errorf,它可以接收格式化字符串,并返回一个实现了error接口的对象。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        num := 42
        err := fmt.Errorf("发生错误,数字是 %d", num)
        fmt.Println(err) // 输出: 发生错误,数字是 42
    }
    

自定义错误类型

除了直接使用errors.New创建的简单错误对象外,通常我们会定义自己的错误类型,以便在程序中更好地处理错误。自定义错误类型需要实现error接口,即定义一个返回字符串的Error()方法。

package main

import (
    "fmt"
)

// MyError 结构体定义了一个自定义错误类型
type MyError struct {
    Msg string
    Code int
}

// Error 方法让 MyError 实现了 error 接口
func (e *MyError) Error() string {
    return fmt.Sprintf("错误代码 %d: %s", e.Code, e.Msg)
}

func main() {
    err := &MyError{
        Msg: "自定义错误消息",
        Code: 500,
    }
    fmt.Println(err) // 输出: 错误代码 500: 自定义错误消息
}

错误链

从Go 1.13开始,标准库引入了错误链的概念,允许将多个错误链接在一起形成一个链表结构。通过fmt.Errorf函数和%w动词来包装另一个错误,从而形成新的错误链。

package main

import (
    "errors"
    "fmt"
)

func firstLevelError() error {
    return errors.New("第一级错误")
}

func secondLevelError() error {
    err := firstLevelError()
    // 使用 %w 包装底层错误
    return fmt.Errorf("第二级错误: %w", err)
}

func thirdLevelError() error {
    err := secondLevelError()
    // 继续包装上一级错误
    return fmt.Errorf("第三级错误: %w", err)
}

func main() {
    err := thirdLevelError()
    fmt.Println(err) // 输出: 第三级错误: 第二级错误: 第一级错误

    // 使用 errors.Unwrap 解包最底层的错误
    unwrappedErr := errors.Unwrap(err)
    fmt.Println(unwrappedErr) // 输出: 第二级错误: 第一级错误

    // 使用 errors.Is 判断错误是否包含指定的错误类型
    isMatch := errors.Is(err, firstLevelError())
    fmt.Println(isMatch) // 输出: true
}

使用errors.As判断错误类型

如果有一个错误链,并且你想找到特定类型的错误,可以使用errors.As函数进行类型断言检查。

package main

import (
    "errors"
    "fmt"
)

type CustomError struct {
    Message string
}

func (e *CustomError) Error() string {
    return e.Message
}

func someFunction() error {
    return &CustomError{Message: "自定义错误信息"}
}

func main() {
    err := someFunction()

    var customErr *CustomError
    if errors.As(err, &customErr) {
        fmt.Printf("找到了自定义错误: %v\n", customErr)
    } else {
        fmt.Println("没有找到自定义错误")
    }
}

以上是关于Go语言errors标准库的一些基本用法和高级特性。

你可能感兴趣的:(golang标准库,golang,开发语言,后端)