首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对errors.Wrap创建的错误使用errors.Is?

如何对errors.Wrap创建的错误使用errors.Is?
EN

Stack Overflow用户
提问于 2021-03-25 05:15:17
回答 1查看 81关注 0票数 1

我喜欢这样做:

代码语言:javascript
复制
var ErrMyCustomError = errors.New("something went wrong")

func doAThing(input string) error {
    if input == "bad input" {
        return ErrMyCustomError
    }
    return nil
}

然后在我的测试中:

代码语言:javascript
复制
func TestFailCase() {
    err := doAThing("bad input")
    require.True(errors.Is(err, ErrMyCustomError)
}

我的问题是,我如何做到这一切,而不是让return ErrMyCustomErrorErrMyCustomError中包装我从其他地方获得的错误(以便errors.Is仍然有效)。

代码语言:javascript
复制
func doAThing(input string) error {
    err := doSomething(input)
    if err != nil {
        return errors.Wrap(err, "some context message") // <-- this line here needs to return an ErrMyCustomError somehow but also wrap err
    }
}

// Imagine this is in some third party lib and I can't alter it.
func doSomething(input string) error {
    if input == "bad input" {
        return errors.New("some error I will later wrap")
    }
    return nil
}

func TestFailCase() {
    err := doAThing("bad input")
    require.True(errors.Is(err, ErrMyCustomError) // <-- this is no longer true but I want it to be
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-01 01:39:17

这是我能想到的最好的办法了。我更喜欢只使用var MyCustomErr = errors.New("something went wrong"),但是这样我就没有办法把它放入错误链中。我更喜欢使用errors.Is,而不是声明一个接收器指针来检查errors.As,但是到目前为止,我还没有找到这样做的方法。

代码语言:javascript
复制
package main

import (
    "errors"
    "fmt"
)

type MyCustomError struct {
    Err   error
}

func (e MyCustomError) Error() string {
    return "something went wrong: " + e.Err.Error()
}

func main() {
    err := myWrapper()
    ptr := &MyCustomError{}
    print(errors.As(err, ptr)) // prints "true"
}

func myWrapper() error {
    err := thirdPartyFunc()
    if err != nil {
        return fmt.Errorf("some additional context: %w", MyCustomError{Err: err})
    }
    return nil
}

func thirdPartyFunc() error {
    return errors.New("this is the error I want to wrap")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66789503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档