【问题标题】:panic: errors: *target must be interface or implement error in Go恐慌:错误:*目标必须是接口或在Go中实现错误
【发布时间】:2021-10-05 09:22:38
【问题描述】:

我正在 Go 中制作一个 json 解组错误处理函数:

import "github.com/pkg/errors"

func parseJSONError(err error) {
    var uterr json.UnmarshalTypeError

    if errors.As(err, &uterr) {
        //...
        return
    }

    var serr json.SyntaxError

    if errors.As(err, &serr) {
        //...
        return
    }
}

但是errors.As()panic: errors: *target must be interface or implement error有一个恐慌。

我们可以从github.com/pkg/errors documentation中了解到什么目标:

func As(err error, target interface{}) bool

问题在于json.UnmarshalTypeErrorjson.SyntaxError 实际上都实现了error 接口。我们可以向encoding/json documentation学习。所以我不知道我做错了什么。即使将 uterrserr 显式转换为 interface{} 也无法挽救这种情况。

恐慌发生在github.com/pkg/errors 和标准errors 包中。

【问题讨论】:

    标签: go error-handling


    【解决方案1】:

    errors.As 的文档指出:

    如果 target 不是非 nil 指向 实现错误的类型或任何接口类型,则会出现恐慌。如果 err 为 nil,则 as 返回 false。

    所以你必须考虑以下几点:

    1. json.UnmarshalTypeError 没有实现 error
    2. *json.UnmarshalTypeError 确实如此,因为方法 Error() string 有一个指针接收器 (docs)
    3. 根据文档,errors.As 想要一个指向实现 error 的指针,所以你需要 **json.UnmarshalTypeError

    将代码改为:

    uterr := &json.UnmarshalTypeError{}
    if errors.As(err, &uterr) {
        // ...
        return
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2022-01-22
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多