在检查解码器失败返回的错误时,我无法检测到 json.SyntaxError。解码操作!
正如你所看到的,调试器向我确认它是一个指向 json.SyntaxError 的指针,但是Errors.Is 无法检测到它。
我检查了错误。是否实施:
func Is(err, target error) bool {
if target == nil {
return err == target
}
isComparable := reflectlite.TypeOf(target).Comparable()
for {
if isComparable && err == target {
return true
}
if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
return true
}
// TODO: consider supporting target.Is(err). This would allow
// user-definable predicates, but also may allow for coping with sloppy
// APIs, thereby making it easier to get away with them.
if err = Unwrap(err); err == nil {
return false
}
}
}
它们是可比较的(isComparable 变量为 true),但是,当我期望它返回 true 时,
if isComparable && err == target {
它会继续...
我做错了什么? 预先感谢。
当前发生的情况是,您将新
json.SyntaxError
的内存地址与从 Decode
返回的错误进行比较。正如您所注意到的,这永远不会是真的。
您想要做的有点不同:检查
err
是否属于 SyntaxError
类型,然后直接使用该对象。这可以使用类型断言来实现,它基本上检查接口的基础类型(在本例中是error
)是否是更具体的类型。
这就是 errors.As 的作用。它填充您指定的特定错误类型。使用这种方法,可以得到以下代码:
if err != nil {
var serr *json.SyntaxError
if errors.As(err, &serr) {
fmt.Println("Syntax error:", serr)
fmt.Println("Offset:", serr.Offset)
} else {
fmt.Println("Other error:", err)
}
}
我是这样实现的
// assert error type
var jsonErr *json.SyntaxError
if suite.ErrorAs(err, &jsonErr) {
suite.Contains(jsonErr.Error(), "invalid character")
}
我正在使用“github.com/stretchr/testify/suite”中的套件进行单元测试。