登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-26 21:06:34 313浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《如何检测带有errors.Is的json.SyntaxError》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

在检查解码器失败返回的错误时,我无法检测到 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),但是,当我期望它在执行 if iscomparable && err == target { 时返回 true 时,它​​会继续...

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


解决方案


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

您想要做的有点不同:检查 err 是否属于 syntaxerror 类型,然后直接使用该对象。这可以使用 type assertions 来实现,它基本上检查接口的基础类型(在本例中为 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)
    }
}

今天关于《如何检测带有errors.Is的json.SyntaxError》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>