golang errors 取 错误 信息_golang-标准errors包的学习

aaa00b5676960d1e48c6c7f65557b692.png

errors包

1. errors包内置的结构体

type errorString struct {
    s string
}

当前结构体,包含一个成员属性s,用于表示错误信息,并且结构体实现了输出错误信息的方法。

func (e *errorString) Error() string {
    return e.s
}

2. errors包内置的初始化方法

func New(text string) error {
    return &errorString{text}
}

用于初始化内部结构体信息,并且返回对应的错误结构体。

备注: golang包提供的错误信息过于简单,只做了一层简单的包装,基于此,在go1.13版本,扩展了错误信息.

文件定义: errorswrap.go

3. 包提供的内置方法。

说明:%w 为处理包装错误的格式化符号.

获取内层的err类型-Unwrap函数

func Unwrap(err error) error {
    u, ok := err.(interface {
        Unwrap() error
    })
    if !ok {
        return nil
    }
    return u.Unwrap()
}

判断是否包含目标的错误类型-IS函数

func Is(err, target error) bool {
    if target == nil {
        return err == target
    }

    isComparable := reflectlite.TypeOf(target).Comparable()
    for {
        // 判断传入的err和target是否相等
        if isComparable && err == target {
            return true
        }

        // 判断传入的err是否包含Is方法,存在就调用,并且返回判断结果
        if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
            return true
        }

        // 获取内层的err信息
        if err = Unwrap(err); err == nil {
            return false
        }
    }
}

断言包含包装err的方法

func As(err error, target interface{}) bool {
    if target == nil {
        panic("errors: target cannot be nil")
    }
    val := reflectlite.ValueOf(target)
    typ := val.Type()
    if typ.Kind() != reflectlite.Ptr || val.IsNil() {
        panic("errors: target must be a non-nil pointer")
    }
    if e := typ.Elem(); e.Kind() != reflectlite.Interface && !e.Implements(errorType) {
        panic("errors: *target must be interface or implement error")
    }
    targetType := typ.Elem()

    // 循环遍历每一层的err
    for err != nil {
        if reflectlite.TypeOf(err).AssignableTo(targetType) {
            val.Elem().Set(reflectlite.ValueOf(err))
            return true
        }
        if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) {
            return true
        }
        err = Unwrap(err)
    }
    return false
}

调用demo.go

package main

import (
    "errors"
    "fmt"
)

func main() {
    e := errors.New("Invalid bad params ")
    w := fmt.Errorf("错误信息:%w",e)
    fmt.Println(errors.Is(w,e))
}

输出信息

E:goprojectstudy>go run main.go
true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值