恐慌:错误:*目标必须是 Go 中的接口或实现错误

gho*_*ear 6 error-handling go

我正在 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我们可以从github.com/pkg/errors 文档中了解 target 是什么:

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

问题在于两者json.UnmarshalTypeError实际上json.SyntaxError都实现了该error接口。我们可以从encoding/json文档中了解到。所以我不知道我做错了什么。即使显式转换uterrand serrto 也interface{}不能挽救这种情况。

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

bla*_*een 17

状态的文档errors.As

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

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

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

将代码更改为:

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

Run Code Online (Sandbox Code Playgroud)