如何在Go 1.20中计算连接错误?

a1o7rhls  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(80)

据我所知,errors.Join()是hashicorp/multierror等多错误收集类型的现成替代品,它收集并排发生的错误。此问题不解决常规错误 Package /展开。
当我替换生产代码时,一些测试在尝试计算联接错误时失败。错误的数量和类型对于管理业务案例都很重要。这对hashicorp/multierror是有效的,因为会生成一个特定的字符串,比如3 errors occurred

package main

import "errors"

func doSomething() error {
    var multierror error
    err1 := errors.New("Hello")
    multierror = errors.Join(err1, err1)
    err2 := errors.New("World")
    multierror = errors.Join(err2, err1)

    return multierror
}

// somewhere else
func test_doSomething(t *testing.T) {
   actual := doSomething()
   assert.Len(t, 2, len(actual)????) // help
}

使用errors.Join()后,如何计算错误数量?
我找不到一种方法来检查连接错误中的错误切片的性质,并且检查所述错误切片本身是不可能的,因为它是私有的。
使用errors.Unwrap(err)可能是一种方法,尽管我得到的不是一个错误,就是nil(如果它是最后一个)。除了errors.As/.Is之外,它并不完全让我们计数一个地址错误。

bnl4lu3b

bnl4lu3b1#

errors.Join()文件说明:
Join返回的非nil错误实现了Unwrap()[]错误方法。
所以errors.Join()返回的error将有一个Unwrap() []error方法。Type assert一个接口类型来保存该方法,你可以调用它,它将以切片的形式返回连接的错误:
举例来说:

err1 := errors.New("err1")
err2 := errors.New("err2")
err := errors.Join(err1, err2)

if uw, ok := err.(interface{ Unwrap() []error }); ok {
    errs := uw.Unwrap()
    fmt.Println("Number of joined errors:", len(errs))
}

这将输出(在Go Playground上尝试):

Number of joined errors: 2

相关问题