为了账号安全,请及时绑定邮箱和手机立即绑定

Go - errors.As() 无法识别类型

Go - errors.As() 无法识别类型

Go
慕虎7371278 2022-11-23 20:20:11

我正在使用辅助函数来解码 JSON。它返回一个自定义错误类型,其中填充了无法解析 JSON 的原因和我应该返回的 HTTP 代码。


package dto


type MalformedRequestError struct {

    Status  int

    Message string

}


func (mr *MalformedRequestError) Error() string {

    return mr.Message

}

解码主体时我做的第一件事就是检查客户端是否正确设置了 Content-Type 标头。


package webhandlers


func decodeJSONBody(w http.ResponseWriter, r *http.Request, dst interface{}) error {

    if r.Header.Get("Content-Type") != "" {

        value, _ := header.ParseValueAndParams(r.Header, "Content-Type")

        if value != "application/json" {

            Message := "Content-Type header is not application/json"

            return &dto.MalformedRequestError{Status: http.StatusUnsupportedMediaType, Message: Message}

        }

    }

    ... etc ...

我尝试使用它errors.As()来检查该函数是否正在返回我的自定义错误,但它不起作用。


package webhandlers


func (i *InternalTokenHandler) Post(w http.ResponseWriter, r *http.Request) {

    type postRequest struct {

        Google_id_token string

    }

    // parse request data

    var parsedRequest postRequest

    err := decodeJSONBody(w, r, &parsedRequest)

    if err != nil {

        // outputs *dto.MalformedRequestError

        fmt.Println(fmt.Sprintf("%T", err))

        var mr *dto.MalformedRequestError

        if errors.As(err, &mr) {

            http.Error(w, mr.Message, mr.Status)

        } else {

            log.Println(err)

            http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)

        }

        return

    }

    .... more code ...

我检查过错误的类型是*dto.MalformedRequestError,但我的代码总是到达else块并返回通用服务器 500 错误。


我错过了什么 - 为什么 errors.As() 无法识别错误类型?


查看完整描述

1 回答

?
牛魔王的故事

TA贡献1546条经验 获得超3个赞

这有效:https ://go.dev/play/p/CWe9mVp7QOz 。

我能想到的唯一会导致您的代码失败的原因(如果它真的失败了)是所dto使用的包decodeJSONBody与所dto使用的包不同InternalTokenHandler.Post,因此这两种错误类型会不同。

请注意,即使是同一包的不同版本也算作不同的包,其中声明的类型也不相同


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信