首页 > 后端开发 > Golang > Go中如何使用Is()和As()实现递归错误包装?

Go中如何使用Is()和As()实现递归错误包装?

Barbara Streisand
发布: 2024-12-11 10:42:11
原创
298 人浏览过

How Can I Achieve Recursive Error Wrapping with Is() and As() in Go?

Go 错误:Is() 和 As() 支持递归错误包装

在 Go 中,错误处理对于管理和分析错误至关重要整个申请过程中。错误接口提供了一种通用的方式来表示错误,它包括 Is() 和 As() 等用于错误自省的方法。

但是需要注意的是,标准错误接口不支持递归错误包装。这意味着,如果您使用 fmt.Errorf 来包装错误,您将无法使用 Is() 和 As() 递归地检查底层错误。

递归错误的自定义错误类型包装

要实现递归错误包装,您可以创建一个实现错误接口的自定义错误类型。此类型应包含对包装错误的引用,并定义自定义 Is() 和 As() 方法以启用递归比较。

以下是递归错误类型的示例实现:

type errorChain struct {
    err  error
    next *errorChain
}

func (c errorChain) Is(err error) bool {
    // Check the current error against the given error
    if c.err == err {
        return true
    }
    // Check if there is a wrapped error and recursively call Is()
    if c.next != nil {
        return c.next.Is(err)
    }
    return false
}

func (c errorChain) As(target interface{}) bool {
    // Check if the current error As() to the target interface
    if errors.As(c.err, target) {
        return true
    }
    // Check if there is a wrapped error and recursively call As()
    if c.next != nil {
        return c.next.As(target)
    }
    return false
}
登录后复制

递归地包装错误

定义自定义错误后类型,您可以使用如下函数递归地包装错误:

func Wrap(errs ...error) error {
    if len(errs) == 0 {
        return nil
    }
    // Create the first error in the chain
    out := &errorChain{err: errs[0]}
    // Iterate over the remaining errors
    for _, err := range errs[1:] {
        // Link the errors together
        out.next = &errorChain{err: err}
        out = out.next
    }
    return out
}
登录后复制

用法

您现在可以使用此自定义错误类型来包装错误并检查使用 Is() 和 As() 递归地产生潜在错误。例如:

var Err1 = errors.New("error 1")
var Err2 = errors.New("error 2")
var Err3 = errors.New("error 3")

err := Wrap(Err1, Err2, Err3)

fmt.Println(errors.Is(err, Err2)) // true
fmt.Println(errors.Is(err, Err3)) // true
fmt.Println(errors.Is(err, Err0)) // false
登录后复制

结论

通过使用递归 Is() 和 As() 方法创建自定义错误类型,可以实现递归错误包装并执行Go 应用程序中更精确的错误处理。

以上是Go中如何使用Is()和As()实现递归错误包装?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板