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

错误处理中间件抛出运行时错误

错误处理中间件抛出运行时错误

Go
DIEA 2023-05-22 15:47:08
我有这个错误处理中间件:func Error(next http.HandlerFunc) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        defer func() {            if err := recover(); err != nil {                log.Error("Caught error in defer/recover middleware: ", err)                originalError := err.(struct{ OriginalError error }).OriginalError                if originalError != nil {                    log.Error("Original error in defer/recover middleware: ", originalError)                }                statusCode := err.(struct{ StatusCode int }).StatusCode                if statusCode != 0 {                    w.WriteHeader(statusCode)                } else {                    w.WriteHeader(http.StatusInternalServerError)                }                message := err.(struct{ Message string }).Message                if message == "" {                    message = "Unknown error message."                }                json.NewEncoder(w).Encode(struct {                    ID string                }{                    message,                })            }        }()        next.ServeHTTP(w, r)    })}
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

从错误消息来看,err对象类型runtime.errorString不是struct { OriginalError error }. 强制类型断言会产生恐慌。

我认为最好在类型断言期间使用第二个返回值,以检查转换过程是否成功。

if err := recover(); err != nil {


    if temp, ok := err.(struct{ OriginalError error }); ok {

        log.Error("Caught error in defer/recover middleware: ", err)

        originalError := temp.OriginalError


        if originalError != nil {

            log.Error("Original error in defer/recover middleware: ", originalError)

        }

    }


    if temp, ok := err.(struct{ StatusCode int }); ok {

        statusCode := temp.StatusCode


        if statusCode != 0 {

            w.WriteHeader(statusCode)

        } else {

            w.WriteHeader(http.StatusInternalServerError)

        }

    }


    if temp, ok := err.(struct{ Message string }); ok {

        message := temp.Message


        if message == "" {

            message = "Unknown error message."

        }


        json.NewEncoder(w).Encode(struct {

            ID string

        }{

            message,

        })

    }

}


查看完整回答
反对 回复 2023-05-22
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

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