猿问

如何检测 json。语法错误,但存在错误。是

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

在这里,您可以看到操场上的工作示例。

如您所见,调试器向我确认它是指向json的指针。语法错误,但错误。是 无法检测到它。

我检查了错误。是实现:


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

        }

    }

}

它们是可比较的(可比较的变量是真的),但是,当我期望它在这样做时返回true时,它会继续......if isComparable && err == target {


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


慕妹3146593
浏览 297回答 1
1回答

沧海一幻觉

当前发生的情况是,您将新邮件的内存地址与 从 返回的错误进行比较。正如你所注意到的,这永远不会是真的。json.SyntaxErrorDecode您要执行的操作略有不同:检查是否为类型,然后直接使用该对象。这可以使用类型断言,它基本上检查接口的基础类型(在本例中)是否为更具体的类型。errSyntaxErrorerror这就是错误。事实也确实如此。它填充您指定的特定错误类型。使用此方法,可以到达以下代码: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)    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答