从库包返回错误类型

时间:2021-08-01 19:47:00

标签: go error-handling shared-libraries

https://github.com/golang/go/wiki/Errors 中,

<块引用>

调用代码将通过使用类型开关

来测试特殊类型的 error

https://github.com/golang/go/wiki/ErrorValueFAQ 中,

<块引用>

如果您当前使用 == 比较错误,请改用 errors.Is
if errors.Is(err, io.ErrUnexpectedEOF)

但是,我一直无法弄清楚如何从我的库包中返回此类错误,以便我的包使用者可以进行错误检查,例如

  • if errors.Is(err, io.ErrUnexpectedEOF)
  • if errors.As(err, &e)

请帮忙。

附注。由于以下初始问题,上述问题成为可能:

Go latest idiomatic error reporting approach from library packages

这两个问题的最佳答案是--
https://blog.golang.org/go1.13-errors

1 个答案:

答案 0 :(得分:1)

errors 软件包文档中所述:

<块引用>

Unwrap、Is 和 As 函数处理可能包装其他错误的错误。

所以关键是为你的错误类型实现 Unwrap。这可以通过以下方式之一完成:

  • fmt.Errorf%w 一起使用
return fmt.Errorf("Some error: %w",io.ErrUnexpectedEOF)

返回的错误包装了意外的 EOF 错误,因此 errors.Iserrors.As 可以解开它。

  • 使用自定义类型:
type MyErrr struct {
 ...
  err error
}

func (err MyErr) Error() string {...}
func (err MyErr) Unwrap() error {return err.err}

那么:

return MyError{err:io.ErrUnexpectedEOF}

这也将被解包以获得意外的 EOF。