gpt4 book ai didi

go - 如何检测带有errors.Is的json.SyntaxError

转载 作者:行者123 更新时间:2023-12-05 01:08:01 26 4
gpt4 key购买 nike

在检查从失败的解码器返回的错误时,我无法检测到 json.SyntaxError。解码操作!

Here you can see a working example in playground.

您可以看到调试器向我确认它是指向 json.SyntaxError 的指针,但错误。无法检测到它。

enter image description here

我检查了错误。正在实现:

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 变量为真)但是,当我希望它返回真时 if isComparable && err == target { 它继续...

我做错了什么?提前致谢。

最佳答案

当前发生的情况是,您将新 json.SyntaxError 的内存地址与 Decode 返回的错误进行比较。正如您所注意到的,这永远不会是真的。

您想要做的有点不同:检查 err 是否属于 SyntaxError 类型,然后直接使用该对象。这可以使用 type assertions ,它基本上检查接口(interface)的底层类型(在这种情况下为 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)
}
}

关于go - 如何检测带有errors.Is的json.SyntaxError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66598338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com