我喜欢这样做:
var ErrMyCustomError = errors.New("something went wrong")
func doAThing(input string) error {
if input == "bad input" {
return ErrMyCustomError
}
return nil
}然后在我的测试中:
func TestFailCase() {
err := doAThing("bad input")
require.True(errors.Is(err, ErrMyCustomError)
}我的问题是,我如何做到这一切,而不是让return ErrMyCustomError在ErrMyCustomError中包装我从其他地方获得的错误(以便errors.Is仍然有效)。
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
}发布于 2021-04-01 01:39:17
这是我能想到的最好的办法了。我更喜欢只使用var MyCustomErr = errors.New("something went wrong"),但是这样我就没有办法把它放入错误链中。我更喜欢使用errors.Is,而不是声明一个接收器指针来检查errors.As,但是到目前为止,我还没有找到这样做的方法。
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")
}https://stackoverflow.com/questions/66789503
复制相似问题