在 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
答案 0 :(得分:1)
如 errors
软件包文档中所述:
Unwrap、Is 和 As 函数处理可能包装其他错误的错误。
所以关键是为你的错误类型实现 Unwrap
。这可以通过以下方式之一完成:
fmt.Errorf
与 %w
一起使用return fmt.Errorf("Some error: %w",io.ErrUnexpectedEOF)
返回的错误包装了意外的 EOF 错误,因此 errors.Is
和 errors.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。